linux多线程编程之条件变量

这些天在看多线程的东西,看了两天的博客,对多线程编程有了大致的了解,但是很不明白的是讲的条件变量那块,本来以为互斥锁能解决一切,但是看了几篇博客,才知道自己这样偷懒不去搞懂是不行的,查了很多资料,好像看懂了条件变量这块,推荐下面几篇博客:

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

 

posted on 2013-09-14 22:12  theCambrian.cpp  阅读(317)  评论(0编辑  收藏  举报

导航