pthread_cond_broadcast&pthread_cond_signal使用_pthread_cond_broadcast与pthread_cond_signal-程序员宅基地

技术标签: linux  多线程  

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

static pthread_cond_t cond;
static pthread_mutex_t mutex1;
static pthread_mutex_t mutex2;
void *thread1_entry(void *arg)
{
        while(1)
        {
                pthread_mutex_lock(&mutex1);
                printf("cond wait cond1\n");
                pthread_cond_wait(&cond, &mutex1);
                printf("recv cond1\n");
                sleep(1);
                pthread_mutex_unlock(&mutex1);

        }
}

void *thread2_entry(void *arg)
{
        while(1)
        {
                pthread_mutex_lock(&mutex1);
                printf("cond wait cond2\n");
                pthread_cond_wait(&cond, &mutex1);
                printf("recv cond2\n");
                sleep(10);
                pthread_mutex_unlock(&mutex1);
        }

}

void *thread3_entry(void *arg)
{
        int ret;
        while(1)
        {
                pthread_mutex_lock(&mutex1);
               
                ret = pthread_cond_broadcast(&cond);
                if(ret < 0)
                {
                        printf("pthread_cond_broadcast error\n");
                }
                
                pthread_mutex_unlock(&mutex1);
                sleep(2);
        }
}
int main(void)
{
        int ret =0;
        pthread_t tid1, tid2, tid3;
        ret = pthread_cond_init(&cond, NULL);
        if(ret < 0)
        {
                printf("pthread_cond_init error\n");
        }
        ret = pthread_mutex_init(&mutex1, NULL);
        if(ret < 0)
        {
                printf("pthread_mutex_init error\n");
        }

        ret = pthread_mutex_init(&mutex2,NULL);
        if(ret < 0)
        {
                printf("pthread_mutex_init error\n");
        }

        ret=  pthread_create(&tid1, NULL, thread1_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread1 error\n");
        }

        ret = pthread_create(&tid2, NULL, thread2_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread2 error\n");
        }
        sleep(2);
        ret = pthread_create(&tid3, NULL, thread3_entry, NULL);
        if(ret < 0)
        {
                printf("pthread_create thread3 error\n");
        }

        while(1)
        {
                sleep(10000);
        }
        return 0;
}

这段代码由于用了同一个锁,两个线程thread1和thread2是顺序执行,如果把thread2更改成用不同的锁,如下

void *thread2_entry(void *arg)
{
        while(1)
        {
                pthread_mutex_lock(&mutex2);
                printf("cond wait cond2\n");
                pthread_cond_wait(&cond, &mutex2);
                printf("recv cond2\n");
                sleep(10);
                
                pthread_mutex_unlock(&mutex2);
        }
}

两个线程的运行是没有关系的, 并行的。

1.pthread_cond_wait 前后需要加锁,pthread_cond_broadcast前后并不一定要加锁

2.pthread_cond_broadcast能同时唤醒多个在等待的线程,pthread_cond_signal一次只能唤醒一个

https://blog.csdn.net/pengrui18/article/details/70556269

https://www.cnblogs.com/XiaoXiaoShuai-/p/11855408.html

https://blog.csdn.net/yeyuangen/article/details/37593533

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fqipkh/article/details/106154500

智能推荐

CSS 清除浮动-程序员宅基地

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的方法,够用了。文章目录1、在浮动元素后面加一个空的div,并为它清除浮动2、利用BFC特性清除浮动3、使用:after伪元素,给浮动元素的父元素清除浮动1、在浮动元素后面加一个空的div,并为它清除浮动html代码:<div class="wrap"> <div cla

android 自定义方形章,第二十四章 Android 自定义模板-程序员宅基地

1. 概述在读鸿洋大神的博客的时候,看到了自定义模板,然后网上查了一些资料,自己了解学习一下,希望和大家分享。我们在创建项目的时候,看到这样一个界面,这里的初始Activity就是模板中的Activity。自定义模板其实模板不只是只有activity 还包括图片自由 布局文件 fragment service 以及一个类都可以制作成模板。慢慢了解,这里只介绍Activity。Android Stu...

从头学前端-37:在表单中常用的伪类选择器_表单伪类选择器-程序员宅基地

大家好,我是一碗周,一个不想被喝(内卷)的前端。如果写的文章有幸可以得到你的青睐,万分有幸~这是【从头学前端】系列文章的第三十七篇-《在表单中常用的伪类选择器》本系列文章在掘金首发,编写不易转载请获得允许本篇文件介绍关于表单输入的伪类,主要介绍三种常用的,具体如下::enabled和:disabled:read-only和:read-write:checked:enabled和:disabled:enabled和:disabled一这组伪类选择器分别表示禁用状态与可用._表单伪类选择器

神舟z7m安装Linux,神舟战神Z7M-KP7GZ怎么装win7旗舰版64位_方柏的博客-程序员宅基地

品牌型号:神舟战神Z7M-KP7GZ操作系统:Win10-64位系统神舟战神Z7M-KP7GZ怎么装win7旗舰版64位?神舟战神Z7M-KP7GZ是一款15.6英寸,预装Windows 10,重2Kg,长度360mm,宽度243mm的影音娱乐本。处理器采用英特尔 酷睿i7 8代系列,CPU主频2.2GHz,六核心/十二线程,内存容量8GB DDR4 2666MHz,硬盘是混合硬盘(SSD+HDD..._z7m-kp7gz

HTML-day03_html表格input年龄步长怎么做-程序员宅基地

HTML-day03表单一、表单的基本语法form:表单标签内含表单元素,所有要向服务器提交的数据都必须放入表单标签中。属性:method(get/post):提交方式get:参数在地址栏可见,不安全;长度有限制(255)post:参数在地址栏不可见,安全;长度不限action:服务器地址(将表单中的数据提交给服务器)name:表单的内部引用名示例:<form method="post" action="http://www.sohu.com"> 名字_html表格input年龄步长怎么做

随便推点

python ccf题解 201312-1 出现次数最多的数_接下来的一行,有 n 个正整数,表示集合 s 中的元素。 输出 本题可能有多解,你的代码应给出满足条-程序员宅基地

201312-1 出现次数最多的数问题描述试题编号: 201312-1 试题名称: 出现次数最多的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式   输入的第一行只有一个正整数n(1 ..._接下来的一行,有 n 个正整数,表示集合 s 中的元素。 输出 本题可能有多解,你的代码应给出满足条件的、按升序排列最小的子集。 例:当存在两个解 { 2 , 2 , 6 } 和 { 6 , 4 },则输出 { 2 , 2 , 6 } 这个解。当问题无解时,输出 no solution! 样例输入 复制

html 小圆点居中,html元素水平居中、垂直居中、水平垂直居中于其父级元素的方法..._框架践行者的博客-程序员宅基地

html元素 水平居中 于 其父级元素的方法:方法1:复制代码代码如下:左右居中方法1复制代码代码如下:html,body,div{margin:0;padding:0;height:100%;position:relative;}.wrap{width:400px;height:300px;margin:10px;border:1px solid #000;}.left-right-middle..._html怎么让小圆点水平排序

React-hooks useState useEffect用法_react effect第二个参数-程序员宅基地

import React, {useState,useEffect} from 'react'import {BrowserRouter as Router,Route,Link} from 'react-router-dom'function Index(){ useEffect(()=>{ console.log('hello,index') return ()=>{ console.log('bye,index')//路由解綁 } },[]._react effect第二个参数

PowerApps使用Excel生成应用的要求_powerapps 创建excel表格-程序员宅基地

将使用 Excel 表中的数据,在 PowerApps 中自动生成你的第一个画布应用。将选择一个 Excel 文件,生成一个应用,然后运行生成的应用。 每个生成的应用都包括屏幕,用于浏览记录、显示记录的详细信息以及创建或更新记录。 通过生成应用,可以使用 Excel 数据快速利用应用,然后自定义该应用以更好地满足需要。Excel 文件必须位于云存储帐户(如 OneDrive、GoogleDrive..._powerapps 创建excel表格

Scrapy原理源码解读以及实战_scrapy源码_bugsayend的博客-程序员宅基地

一.Scrapy框架原理下面是scrapy框架运行的整体原理图其中引擎是框架的整体的核心,负责与各个组件之间通信,下面介绍一下各个组件的具体功能引擎(Scrapy Engine)引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。调度器(Scheduler)调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。下载器(Downloader)下载器负责获取页面数据并提供给引擎,而后提供给spider。SpidersSpider是Scrapy用户编_scrapy源码

【原】模块间(dll, exe)使用导出变量、静态变量和外部变量的试验与结论-程序员宅基地

这个在2008年写的老帖在网上已经找不到了(之前发表在blogspot和Windows Live Space上,现在都访问不了了),幸好在硬盘上还有备份,重新发上来,以作备忘。//Dll头文件声明AFX_EXT_DATAintD1_nCount;externintD1_nCountE;staticintD1_nCountS=0;..._dll中的静态变量