Unix 环境高级编程---线程创建、同步、
一下代码主要实现了linux下线程创建的基本方法,这些都是使用默认属性的。以后有机会再探讨自定义属性的情况。主要是为了练习三种基本的线程同步方法:互斥、读写锁以及条件变量。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h> int g_count = ;
pthread_mutex_t mutex_lock;
pthread_rwlock_t rw_lock;
pthread_cond_t con_val = PTHREAD_COND_INITIALIZER; typedef enum
{
MutexLock = ,
RWLock,
CondLock
}LockType; typedef struct
{
int val;
LockType type;
}ThreadData; void PrintThreadId()
{
pid_t pid;
pthread_t tid; pid = getpid();
tid = pthread_self(); printf("[%s] process id : %d thread id : 0x%lx\n",__func__,pid,tid);
} void CleanUpFun(void *arg)
{ printf("[%s] clean up : %s \n",__func__,(char *)arg);
} void AddCount(int tid,LockType type)
{
if(type == MutexLock)
{
printf("[%s] thread %d MutexLock the count is : %d\n",__func__,tid,g_count);
pthread_mutex_lock(&mutex_lock);
while(g_count < )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count++;
}
printf("\n");
pthread_mutex_unlock(&mutex_lock);
} if(type == RWLock)
{
pthread_rwlock_wrlock(&rw_lock);
printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count);
while(g_count < )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count++;
}
printf("\n");
pthread_rwlock_unlock(&rw_lock); } if(type == CondLock)
{
printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count);
pthread_mutex_lock(&mutex_lock); g_count = ;
printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count); pthread_mutex_unlock(&mutex_lock); pthread_cond_signal(&con_val);
} } void DelCount(int tid,LockType type)
{
usleep(); if(type == MutexLock)
{
pthread_mutex_lock(&mutex_lock); printf("[%s] thread %d MutexLock the count is : %d\n",__func__,tid,g_count);
while(g_count > )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count--;
}
printf("\n");
pthread_mutex_unlock(&mutex_lock);
} if(type == RWLock)
{
pthread_rwlock_wrlock(&rw_lock); printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count);
while(g_count > )
{
usleep();
printf("%d-%d \t",tid,g_count);
g_count--;
}
printf("\n");
pthread_rwlock_unlock(&rw_lock); } if(type == CondLock)
{
pthread_mutex_lock(&mutex_lock); // printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count); //while(1)
{
pthread_cond_wait(&con_val,&mutex_lock); printf("[%s] thread %d CondLock the count is : %d\n",__func__,tid,g_count);
} pthread_mutex_unlock(&mutex_lock);
} } void PrintCount(int tid,LockType type)
{
if(type == RWLock)
{
pthread_rwlock_rdlock(&rw_lock); printf("[%s] thread %d RWLock the count is : %d\n",__func__,tid,g_count); pthread_rwlock_unlock(&rw_lock);
}
else
{ } } void ChangCount(int tid,LockType type)
{ if((tid == ) || (tid == ))
{
AddCount(tid,type);
}
else if((tid == ))
{
DelCount(tid,type);
}
else if(tid == )
{
PrintCount(tid,type);
} } void * ThreadFun(ThreadData *t)
{
printf("\n----------------------------------------------------------\n"); int val = ;
LockType type = ;
val = t->val;
type = t->type; printf("[%s] this is thread %d\n",__func__,val);
PrintThreadId(); char buf[];
sprintf(buf,"thread %d first handler ",val);
pthread_cleanup_push(CleanUpFun,buf);/*push and pop must be coupled*/ int len = strlen(buf);
sprintf(buf+len+,"thread %d second handler ",val);/*Notice !!! */
pthread_cleanup_push(CleanUpFun,buf+len+);/*the buf must start from different address , to the cleanupfunc ,the poniter is the same !!!*/ ChangCount(val,type); if(val == )
{
printf("----------------------------------------------------------\n");
return ((void *)val);/*clean up func won't run*/
}
else
{
printf("----------------------------------------------------------\n");
pthread_exit((void *)val);/*clean up func won run*/
}
pthread_cleanup_pop();
pthread_cleanup_pop(); return ((void *)val);
} void JoinThread(pthread_t tid)
{
void * ret; int err; err = pthread_join(tid,&ret); if(err != )
{
printf("error to join thread %lu\n",tid);
} printf("\n[%s] catch thread 0x%lx , the return val is %d\n",__func__,tid,(int)ret);
} void CreateThread(LockType type)
{
int err; ThreadData t1;
ThreadData t2;
ThreadData t3; t1.val = ;
t2.val = ;
t3.val = ; pthread_t tid_1;
pthread_t tid_2;
pthread_t tid_3; if(type == MutexLock)
{
/*Mutex lock*/
t1.type = MutexLock;
t2.type = MutexLock;
t3.type = MutexLock; err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
} JoinThread(tid_1);
JoinThread(tid_2); }
else if(type == RWLock)
{
/*rw lock*/
t1.type = RWLock;
t2.type = RWLock;
t3.type = RWLock; err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
} err = pthread_create(&tid_3,NULL,(void *)ThreadFun,(void *)&t3);
if(err != )
{
printf("error to create thread !\n");
}
JoinThread(tid_1);
JoinThread(tid_2);
JoinThread(tid_3);
}
else if(type == CondLock)
{
t1.type = CondLock;
err = pthread_create(&tid_1,NULL,(void *)ThreadFun,(void *)&t1);
if(err != )
{
printf("error to create thread !\n");
} sleep();
t2.type = CondLock;
err = pthread_create(&tid_2,NULL,(void *)ThreadFun,(void *)&t2);
if(err != )
{
printf("error to create thread !\n");
}
JoinThread(tid_1);
JoinThread(tid_2); } } void InitMutexLock()
{
if(pthread_mutex_init(&mutex_lock,NULL) != )
{
printf("[Main] error to init mutex lock\n");
}
} void DestoryMutexLock()
{
if(pthread_mutex_destroy(&mutex_lock) != )
{
printf("[Main] error to destory mutex lock\n");
}
} void DestoryRWLock()
{
if(pthread_rwlock_destroy(&rw_lock) != )
{
printf("[Main] error to destroy rw lock \n");
} } void InitRWLock()
{
if(pthread_rwlock_init(&rw_lock,NULL) != )
{
printf("[Main] error to init rw lock\n");
}
} int main(int argc,char **argv)
{
printf("=====================================mutex lock=====================================\n"); InitMutexLock(); CreateThread(MutexLock); DestoryMutexLock(); printf("=====================================rw lock=====================================\n"); InitRWLock(); CreateThread(RWLock); DestoryRWLock(); printf("=====================================Cond lock=====================================\n"); InitMutexLock(); CreateThread(CondLock); DestoryMutexLock();
printf("[Main] quit\n"); return ;
}
运行效果如下:
tiger@ubuntu:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/THREAD$ ./thread
=====================================mutex lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6f54b70
[AddCount] thread MutexLock the count is : ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
- - - - - - - - - -
----------------------------------------------------------
[DelCount] thread MutexLock the count is :
- [CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler
- - - - - - - - -
---------------------------------------------------------- [JoinThread] catch thread 0xb7755b70 , the return val is [JoinThread] catch thread 0xb6f54b70 , the return val is
=====================================rw lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6753b70
[PrintCount] thread RWLock the count is :
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
[AddCount] thread RWLock the count is : ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6f54b70
- - - - - - - - - -
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler
[DelCount] thread RWLock the count is :
- - - - - - - - - -
---------------------------------------------------------- [JoinThread] catch thread 0xb6f54b70 , the return val is [JoinThread] catch thread 0xb7755b70 , the return val is [JoinThread] catch thread 0xb6753b70 , the return val is
=====================================Cond lock===================================== ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb6753b70 ----------------------------------------------------------
[ThreadFun] this is thread
[PrintThreadId] process id : thread id : 0xb7755b70
[AddCount] thread CondLock the count is :
[AddCount] thread CondLock the count is :
[DelCount] thread CondLock the count is :
---------------------------------------------------------- [JoinThread] catch thread 0xb6753b70 , the return val is
----------------------------------------------------------
[CleanUpFun] clean up : thread second handler
[CleanUpFun] clean up : thread first handler [JoinThread] catch thread 0xb7755b70 , the return val is
[Main] quit
tiger@ubuntu:/mnt/hgfs/e/Lessons/MyExercise/UtilLibs/THREAD$
代码相当拙劣基础,欢迎拍砖。
Unix 环境高级编程---线程创建、同步、的更多相关文章
- UNIX环境高级编程——线程属性
pthread_attr_t 的缺省属性值 属性 值 结果 scope PTHREAD_SCOPE_PROCESS 新线程与进程中的其他线程发生竞争. detachstate PTHREAD_CREA ...
- UNIX环境高级编程——线程
线程包含了表示进程内执行环境必需的信息,其中包括进程中标示线程的线程ID.一组寄存器值.栈.调度优先级和策略.信号屏蔽字.errno变量以及线程私有数据. 进程的所有信息对该进程的所有线程都是共享的, ...
- UNIX环境高级编程——线程同步之互斥锁、读写锁和条件变量(小结)
一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init( ...
- UNIX环境高级编程——线程同步之条件变量以及属性
条件变量变量也是出自POSIX线程标准,另一种线程同步机制.主要用来等待某个条件的发生.可以用来同步同一进程中的各个线程.当然如果一个条件变量存放在多个进程共享的某个内存区中,那么还可以通过条件变量来 ...
- UNIX环境高级编程——线程同步之读写锁以及属性
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...
- UNIX环境高级编程——线程同步之互斥量
互斥量(也称为互斥锁)出自POSIX线程标准,可以用来同步同一进程中的各个线程.当然如果一个互斥量存放在多个进程共享的某个内存区中,那么还可以通过互斥量来进行进程间的同步. 互斥量,从字面上就可以知道 ...
- UNIX环境高级编程——线程和fork
当线程调用fork时,就为子进程创建了整个进程地址空间的副本.子进程通过继承整个地址空间的副本,也从父进程那里继承了所有互斥量.读写锁和条件变量的状态.如果父进程包含多个线程,子进程在fork返回以后 ...
- UNIX环境高级编程——线程私有数据
线程私有数据(Thread-specific data,TSD):存储和查询与某个线程相关数据的一种机制. 在进程内的所有线程都共享相同的地址空间,即意味着任何声明为静态或外部变量,或在进程堆声明的变 ...
- UNIX环境高级编程——线程属性之分离属性
说到线程的分离状态,我认为,之所以会有这个状态,是因为系统对某些线程的终止状态根本不感兴趣导致的. 我们知道,进程中的线程可以调用: int pthread_join(pthread_t tid, v ...
随机推荐
- maven-source 1.3 中不支持注释请使用 -source 5 或更高版本以启用注释
解决办法:在pom里 加上以下代码 <build> <plugins> <plugin> <groupId>org.apache.maven.plugi ...
- UVa 11210 (DFS) Chinese Mahjong
大白书第一章的例题,当时看起来很吃力,现如今A这道题的话怎么写都无所谓了. 思路很简单,就是枚举胡哪张牌,然后枚举一下将牌,剩下如果能找到4个顺子或者刻子就胡了. 由于粗心,34个字符串初始化写错,各 ...
- CocoStudio UI 编辑器的使用
详细教程:http://www.cocoachina.com/bbs/read.php?tid=161567 Table of Contents 1 游戏中的 UI 1.1 基于 Cocos2d-x ...
- python练习程序(c100经典例20)
题目: 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? def foo(height,num): sum=height; pr ...
- T-SQL备忘(3):分组合并
--CREATE TABLE test(code varchar(50), [name] varchar(10),[count] int ) --INSERT test SELECT '001' , ...
- JBPM4入门——9.自动节点单线执行
JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流程图的插件 JBPM4入门——3.JBPM4开发环境的搭建 JBPM4入门—— ...
- appdata文件夹有什么用途?C盘appdata可以删除吗?
在内存紧张的时候,我们都会选择删除一些无关紧要的大文件来释放内存,有不少网友发现在系统C盘下有一个appdata文件夹,而且体积挺大的,不知道能不能删除,针对此问题,本文就为大家介绍appdata文件 ...
- php.ini中Magic_Quotes_Gpc开关设置
如果你网站空间的php.ini文件里的magic_quotes_gpc设成了off,那么PHP就不会在敏感字符前加上反斜杠(\\),由于表单提交的内容可能含有敏感字符,如单引号('),就导致了SQL ...
- 关于jdbc收集
一.如果我这样获得一个resultset ResultSet rs=statment.execquery("select * from tab"我如何能够从resultset中获得 ...
- Sde表结构分析
原文 Sde表结构分析 今天开始想分析一下sde的表结构,希望能够弄明白sde一个要素类的每个Feature是如何存储的. 弄ArcSDE的人都知道,ArcSDE内一个要素类在关系数据库(以MS SQ ...