• 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
  • 相关阅读:
    【原创】Cookie应用(二)
    空间数据可视化
    jquery 相册
    两个时间的月份差
    SQL2005 分页
    mssql 评估期过了
    获得文件夹内的文件,按时间排序
    linux使用privoxy将55转为http代理
    OpenCV之创建矩阵并画绿色矩形
    vs2010导入vc 6.0的资源文件方法
  • 原文地址:https://www.cnblogs.com/theCambrian/p/3321849.html
Copyright © 2020-2023  润新知