zoukankan      html  css  js  c++  java
  • Linux 开发之线程条件锁那些事

    条件锁即在一定条件下触发,那什么时候适合用条件锁呢,那当然是你在等待一个符合的条件下触发。一个常用的例子就是在线程中无限循环执行一个操作,但是这个操作并不是需要 一直执行而是在满足一定条件下执行。例如:

    int changed = 0;

    static pthread_mutext_t mtx = PTHREAD_MUTEX_INITALIZER;

    static pthread_cond_t cond = PTHREAD_COND_INITALIZER;

    void* thread_fun(void* argc)

    {

    while(true)

    {

    if(changed)

    {

    printf("i am changed");

    }else

    {

    //方法一

    sleep(1);

    //方法二

    pthread_mutex_lock(&mtx);

    pthread_cond_wait(&cond,&mtx);

    pthread_mutex_unloc(&mtx);

    }

    }

    }

    void main()

    {

    pthread_t threadId;

    pthread_create(&threadId,NULL,thread_fun,NULL);

    sleep(10);

    changed = 1;

    //方法二

    pthread_cond_signal(&cond);

    }

    从上面的例子可以看出当changed变量为1的时候才执行操作,其他时间不执行,如果使用sleep函数,那么将会出现执行不及时的现象,如果使用条件锁的话那么会在条件改变的时候立即执行,效果比较好。

    那如果使用条件锁呢?

    首先是条件锁的创建,条件锁创建有两种方法,一种是静态方法,既使用静态变量的方式:

    static pthread_cond_t cond = PTHREAD_COND_INITALIZER;

    另外一种是动态的方法:

    pthread_cond_init(pthread_cond_t *cv,const pthread_condattr_t *cattr);

    其次是等待: pthread_cond_wait,此方法可以加超时的时间,如果没有超时的时间则是一直等待。

    再次是触发:当达到条件之后使用 pthread_cond_signal通知

    但是在多线程里面必须要配合互斥锁,因为在多线程的条件下如果不使用互斥锁,那么就有可能同时多个执行ptread_cond_wait会造成混乱。

    转载于:https://my.oschina.net/u/1013544/blog/1788088

  • 相关阅读:
    操作系统之进程篇(3)
    指针和数组及内存管理
    进程篇(3: 基本进程控制:进程的退出)--请参照本博客“操作系统”专栏
    Java面向对象程序设计--泛型编程
    进程篇(1: 进程运行环境)--请参照本博客“操作系统”专栏
    操作系统之进程篇(1)
    分类器性能指标之ROC曲线、AUC值
    如何理解似然函数?
    sigmoid函数简介
    Hive分析窗口函数
  • 原文地址:https://www.cnblogs.com/twodog/p/12137199.html
Copyright © 2011-2022 走看看