最近找到一篇很好的文章将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分割线_________________________
pthreadCondWait.c
___________________至关重要的绚烂的结果分割线_________________
[root@iZ25dcp92ckZ testdemo]# vi pthreadCondWait.c
[root@iZ25dcp92ckZ testdemo]# gcc pthreadCondWait.c -lpthread -o pthreadCondWaitStudy
[root@iZ25dcp92ckZ testdemo]# ./pthreadCondWaitStudy
thead1:1
Up Unlock Mutex
thead1:2
Up Unlock Mutex
Up Unlock Mutex
thread2:3
Down Ulock Mutex
thread2:3
Down Ulock Mutex
thead1:4
Up Unlock Mutex
thead1:5
Up Unlock Mutex
Up Unlock Mutex
thread2:6
Down Ulock Mutex
thread2:6
Down Ulock Mutex
thead1:7
Up Unlock Mutex
thead1:8
Up Unlock Mutex
Up Unlock Mutex
thread2:9
Down Ulock Mutex
_________________HOW IT WORKS________
i不是三的倍数的时候.
thread2条件变量阻塞,释放Mutex
thread1加锁,打印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 Stones
You 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
条件变量的结构为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分割线_________________________
pthreadCondWait.c
___________________至关重要的绚烂的结果分割线_________________
[root@iZ25dcp92ckZ testdemo]# vi pthreadCondWait.c
[root@iZ25dcp92ckZ testdemo]# gcc pthreadCondWait.c -lpthread -o pthreadCondWaitStudy
[root@iZ25dcp92ckZ testdemo]# ./pthreadCondWaitStudy
thead1:1
Up Unlock Mutex
thead1:2
Up Unlock Mutex
Up Unlock Mutex
thread2:3
Down Ulock Mutex
thread2:3
Down Ulock Mutex
thead1:4
Up Unlock Mutex
thead1:5
Up Unlock Mutex
Up Unlock Mutex
thread2:6
Down Ulock Mutex
thread2:6
Down Ulock Mutex
thead1:7
Up Unlock Mutex
thead1:8
Up Unlock Mutex
Up Unlock Mutex
thread2:9
Down Ulock Mutex
_________________HOW IT WORKS________
i不是三的倍数的时候.
thread2条件变量阻塞,释放Mutex
thread1加锁,打印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 Stones
You 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
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/8298/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2015-10-20 11:29
评论列表