相关推荐:linux多线程pthread学习笔记--基本概念

在学习多线程之前,先搞清楚一下几个概念 1,什么是进程,什么是线程,什么是同步? 每个正在系统上运行的程序都是一个进程,每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集

最近找到一篇很好的文章将linux多线程函数pthread_cond_wait,是我茅塞顿开,豁然开朗,决定转载过来,以便经常复习记忆。 条件变量的结构为pthread_cond_t,函数pthread_cond_init()被用来初始化一个条件变量。它的原型为:

extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr));

其中cond是一个指向结构pthread_cond_t的指针,cond_attr是一个指向结构pthread_condattr_t的指针。结构 pthread_condattr_t是条件变量的属性结构,和互斥锁一样我们可以用它来设置条件变量是进程内可用还是进程间可用,默认值是 PTHREAD_ PROCESS_PRIVATE,即此条件变量被同一进程内的各个线程使用。注意初始化条件变量只有未被使用时才能重新初始化或被释放。释放一个条件变量的函数为pthread_cond_destroy(pthread_cond_t cond)。

也可以静态的初始化条件变量

pthread_cond_t my_condition = PTHREAD_COND_INITIALIZER;

函数pthread_cond_wait()使线程阻塞在一个条件变量上。它的函数原型为:

extern int pthread_cond_wait __P ((pthread_cond_t *__cond,pthread_mutex_t *__mutex));

调用这个函数时,线程解开mutex指向的锁并被条件变量cond阻塞。线程可以被函数pthread_cond_signal和函数 pthread_cond_broadcast唤醒线程被唤醒后,它将重新检查判断条件是否满足,如果还不满足,一般说来线程应该仍阻塞在这里,被等待被下一次唤醒。这个过程一般用while语句实现。

通过下面的程序来理解:__________________华丽的CODE分割线_________________________#include #include #include pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; /*初始化互斥锁*/pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

//初始化条件变量 void *thread1(void *);void *thread2(void *);int i=1;int main(void){

pthread_t t_a;

pthread_t t_b;

pthread_create(&t_a,NULL,thread1,(void *)NULL);/*创建进程t_a*/

pthread_create(&t_b,NULL,thread2,(void *)NULL); /*创建进程t_b*/

pthread_join(t_b, NULL);/*等待进程t_b结束*/

pthread_mutex_destroy(&mutex);

pthread_cond_destroy(&cond);

exit(0);}void *thread1(void *junk){

for(i=1;i<=9;i++)

{

pthread_mutex_lock(&mutex);//

if(i%3==0)

pthread_cond_signal(&cond);/*条件改变,发送信号,通知t_b进程*/

else

printf("thead1:%d\n",i);

pthread_mutex_unlock(&mutex);//*解锁互斥量*/

printf("Up Unlock Mutex\n");

sleep(1);

}}void *thread2(void *junk){

while(i<9)

{

pthread_mutex_lock(&mutex);

if(i%3!=0)

pthread_cond_wait(&cond,&mutex);/*等待*/

printf("thread2:%d\n",i);

pthread_mutex_unlock(&mutex);

printf("Down Ulock Mutex\n");

sleep(1);

}}___________________至关重要的绚烂的结果分割线_________________thead1:1Up Unlock Mutexthead1:2Up Unlock MutexUp Unlock Mutexthread2:3Down Ulock Mutexthead1:4Up Unlock Mutexthead1:5Up Unlock MutexUp Unlock Mutexthread2:6Down Ulock Mutexthead1:7Up Unlock Mutexthead1:8Up Unlock MutexUp Unlock Mutexthread2:9Down Ulock Mutex_________________HOW IT WORKS________i不是三的倍数的时候.thread2条件变量阻塞,释放Mutexthread1加锁,打印thread1:i,释放锁,打印"Up Unlock Mutex"i为3的倍数的时候,thread1,加锁,条件变量通知,唤醒条件变量阻塞线程,打印"Up Unlock Mutex"thread2,被唤醒,加锁,打印"thread2:i",释放锁,打印"Down Ulock Mutex"

所以说函数pthread_cond_wait()调用时,不仅对条件变量起作用,还对互斥锁有作用!++++++++++++++++唯美的好书推荐线++++++++++++"Beiginning Linux Programming" by Neil Matthrew & Richard StonesYou can choose the English version or Chinese version, but I recommend the English one. Maybe it' easier to understand what the authers say than the Chinese one ,

even if you're Chinese. 原文地址:http://blogold.chinaunix.net/u1/53448/showart_431857.html

相关推荐:linux多线程pthread学习笔记--基本概念

在学习多线程之前,先搞清楚一下几个概念 1,什么是进程,什么是线程,什么是同步? 每个正在系统上运行的程序都是一个进程,每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集

快照源:http://blog.chinaunix.net/uid-31343430-id-5728533.html