多线程——条件变量的概念和实现

这篇具有很好参考价值的文章主要介绍了多线程——条件变量的概念和实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

条件变量,也称条件锁,是利用线程间共享的全局变量进行同步的一种机制,

主要包括两个动作:

1)一个线程等待"条件变量的条件成立"而挂起;

2)另一个线程使"条件成立"(给出条件成立信号)条件的检测是在互斥锁的保护下进行的如果一个条件为假,一个线程自动阻塞,并释放等待状态改变的互斥锁。

如果另一个线程改变了条件,它发信号给关联的条件变量,唤醒一个或多个等待它的线程,重新获得互斥锁,重新评价条件。

如果两进程共享可读写的内存,条件变量可以被用来实现这两进程间的线程同步

函数API

多线程——条件变量的概念和实现

多线程——条件变量的概念和实现

说明:

只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。

因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。 

 多线程——条件变量的概念和实现

多线程——条件变量的概念和实现 说明:函数将解锁mutex参数指向的互斥锁,并使当前线程阻塞在cv参数指向的条件变量上。

阻塞的线程,可以被以下条件唤醒

1)pthread_cond_signal函数

2)pthread_cond_broadcast函数

3)在被信号中断后被唤醒

 多线程——条件变量的概念和实现

说明:

1)必须在互斥锁的保护下使用相应的条件变量。否则对条件变量的解锁有可能发生在锁定条件变量之前,从而造成死锁。

2)如果没有线程被阻塞在条件变量上,那么调用pthread_cond_signal()将没有作用。 

 多线程——条件变量的概念和实现

 多线程——条件变量的概念和实现

说明:

1)函数唤醒所有被pthread_cond_wait函数阻塞在某个条件变量上的线程,参数cv被用来指定这个条件变量

2)当没有线程阻塞在这个条件变量上时,pthread_cond_broadcast函数无效。

3)由于pthread_cond_broadcast函数唤醒所有阻塞在某个条件变量上的线程,这些线程被唤醒后将再次竞争相应的互斥锁,所以必须小心使用pthread_cond_broadcast函数。 

 代码实例

#include<pthread.h>
#include<stdio.h>
#include<unistd.h>

unsignedcount=0;   //定义全局共享资源

//1.声明两个锁对象
pthread_mutex_t   mutex;
pthread_cond_t    cond;

//---------------消费者---------------------------------
void*decrement_count(void*arg)
{
    printf("[+]decrement_countbegintorun\n");
    //添加互斥锁
    pthread_mutex_lock(&mutex);
    /*条件变量不成立,调用pthread_cond_wait实现2件事:
    1.阻塞2.解锁*/
    while(count==0)
    {
        printf("[+]decrement_countcount==0\n");
        usleep(300000);
        pthread_cond_wait(&cond,&mutex);
    }
    //处理全局变量
    count--;
    pthread_mutex_unlock(&mutex);
    return(void*)1;
}
//---------------生产者---------------------------------
void*increment_count(void*arg)
{
    printf("[-]increment_countbegintorun\n");
    pthread_mutex_lock(&mutex);
    //创建条件成立,调用pthread_cond_signal(&cond);通知消费者
    if(count==0)
    {
        /*count做递减操作*/
        count=count+1;
        printf("[-]tid2:count=%d\n",count);
        pthread_cond_signal(&cond);
    }
    pthread_mutex_unlock(&mutex);
    return(void*)2;
}

int main()
{
    pthread_ttid1,tid2;
    /*初始化锁*/
    pthread_mutex_init(&mutex,NULL);
    /*初始化条件变量*/
    pthread_cond_init(&cond,NULL);

    tid1=pthread_create(&tid1,NULL,decrement_count,NULL);

    printf("[*]sucesstocreatedecrement_count\n");
    sleep(2);

    tid2=pthread_create(&tid2,NULL,increment_count,NULL);
    printf("[*]sucesstocreateincrement_count\n");
    sleep(10);

    //两种方式回收其子线程资源

    //1.连接2.分离
    /*3.销毁锁*/
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

    printf("[*]mainthread,beginexit!\n");

    pthread_exit(0);
    return0;
}

 结构流程

1 初始化    锁    和    条件变量

消费者

上锁,这个锁是互斥锁,代表代码中的count变量只能被这个线程操作。

判断条件变量:这里是判断的全局变量count

这里假设count不满足,执行了条件变量的使用函数,里面的参数是条件变量和锁变量,意思是这个线程阻塞并等待条件变量,以及解锁,将count释放给其他线程。

然后陷入了等待

生产者

上锁

给消费者线程提供条件,改变count的值

发送唤醒信号pthread_cond_signal

解锁,注意这里要单独解锁。

又回到了消费者

消费者操作之后,解锁。文章来源地址https://www.toymoban.com/news/detail-411984.html

到了这里,关于多线程——条件变量的概念和实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包