这些天在看多线程的东西,看了两天的博客,对多线程编程有了大致的了解,但是很不明白的是讲的条件变量那块,本来以为互斥锁能解决一切,但是看了几篇博客,才知道自己这样偷懒不去搞懂是不行的,查了很多资料,好像看懂了条件变量这块,推荐下面几篇博客:
http://blog.csdn.net/ithomer/article/details/6031723
有个例子很不错
http://egeho123.blogbus.com/logs/10821816.html
条件锁pthread_cond_t
说明,
等待线程
1。使用pthread_cond_wait前要先加锁
2。pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活
3。pthread_cond_wait被激活后会再自动加锁
激活线程:
1。加锁(和等待线程用同一个锁)
2。pthread_cond_signal发送信号
3。解锁
激活线程的上面三个操作在运行时间上都在等待线程的pthread_cond_wait函数内部。
程序示例:
#include <stdio.h> #include <pthread.h> #include <unistd.h> pthread_mutex_t count_lock; pthread_cond_t count_nonzero; unsigned count = 0; void *decrement_count(void *arg) { pthread_mutex_lock(&count_lock); printf("decrement_count get count_lock/n"); while(count == 0) { printf("decrement_count count == 0 /n"); printf("decrement_count before cond_wait /n"); pthread_cond_wait(&count_nonzero, &count_lock); printf("decrement_count after cond_wait /n"); } count = count + 1; pthread_mutex_unlock(&count_lock); } void *increment_count(void *arg) { pthread_mutex_lock(&count_lock); printf("increment_count get count_lock /n"); if(count == 0) { printf("increment_count before cond_signal /n"); pthread_cond_signal(&count_nonzero); printf("increment_count after cond_signal /n"); } count = count + 1; pthread_mutex_unlock(&count_lock); } int main(void) { pthread_t tid1, tid2; pthread_mutex_init(&count_lock, NULL); pthread_cond_init(&count_nonzero, NULL); pthread_create(&tid1, NULL, decrement_count, NULL); sleep(2); pthread_create(&tid2, NULL, increment_count, NULL); sleep(10); pthread_exit(0); return 0; }
运行结果: [work@db-testing-com06-vm3.db01.baidu.com pthread]$ gcc -o pthread_cond pthread_cond.c -lpthread [work@db-testing-com06-vm3.db01.baidu.com pthread]$ ./pthread_cond decrement_count get count_lock decrement_count count == 0 decrement_count before cond_wait increment_count get count_lock increment_count before cond_signal increment_count after cond_signal decrement_count after cond_wait