pthread_cond_signal 和pthread_cond_wait

devtools/2024/9/23 5:01:47/

0、pthread_join()函数作用:

        pthread_join() 函数会一直阻塞调用它的线程,直至目标线程执行结束(接收到目标线程的返回值),阻塞状态才会解除。如果 pthread_join() 函数成功等到了目标线程执行结束(成功获取到目标线程的返回值),返回值为数字 0

int pthread_join(pthread_t thread, void ** retval);

thread 参数用于指定接收哪个线程的返回值;retval 参数表示接收到的返回值,如果 thread 线程没有返回值,又或者我们不需要接收 thread 线程的返回值,可以将 retval 参数置为 NULL。

1、pthread_cond_wait()  用于阻塞当前线程,等待别的线程使用 pthread_cond_signal() 或pthread_cond_broadcast来唤醒它 。  pthread_cond_wait()   必须与pthread_mutex 配套使用。

    pthread_cond_signal 函数的作用是发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态,继续执行.如果没有线程处在阻塞等待状态,pthread_cond_signal也会成功返回。

2、  pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要根据共享变量的状态来决定是否要等待,而为了不永远等待下去所以必须要在lock/unlock队中。

3、pthread_cond_signal既可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也可以放在pthread_mutex_lock和pthread_mutex_unlock之后,但是各有各缺点。

所以,在Linux下最好pthread_cond_signal放中间,但从编程规则上说,其他两种都可以。

4、例子:

#include <stdio.h>#include <stdlib.h>#include <pthread.h>pthread_cond_t cond; // 定义条件变量pthread_mutex_t mutex; // 定义互斥量int condition = 0; // 条件void *thread_func1(void *arg){// 获取互斥锁pthread_mutex_lock(&mutex);printf("Thread 1: before wait\n");// 等待条件变量while(!condition){// 条件不满足时挂起线程1pthread_cond_wait(&cond, &mutex);}printf("Thread 1: after wait\n");// 释放互斥锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);}void *thread_func2(void *arg){// 获取互斥锁pthread_mutex_lock(&mutex);printf("Thread 2: before signal\n");// 设置条件condition = 1;// 唤醒一个被挂起的线程pthread_cond_signal(&cond);printf("Thread 2: after signal\n");// 释放互斥锁pthread_mutex_unlock(&mutex);pthread_exit(NULL);}int main(){// 初始化互斥量pthread_mutex_init(&mutex, NULL);// 初始化条件变量pthread_cond_init(&cond, NULL);pthread_t thread1, thread2;// 创建线程1pthread_create(&thread1, NULL, thread_func1, NULL);// 创建线程2pthread_create(&thread2, NULL, thread_func2, NULL);// 等待线程1结束pthread_join(thread1, NULL);// 等待线程2结束pthread_join(thread2, NULL);// 销毁互斥量pthread_mutex_destroy(&mutex);// 销毁条件变量pthread_cond_destroy(&cond);return 0;}/*** 运行结果:* Thread 1: before wait* Thread 2: before signal* Thread 2: after signal* Thread 1: after wait** 程序先创建了两个线程,分别为thread1和thread2,* 其中thread1调用了pthread_cond_wait函数挂起了自己,* 当thread2调用pthread_cond_signal函数唤醒thread1时,* thread1才继续执行。* 该程序中使用了pthread_mutex_lock和pthread_mutex_unlock* 来保护条件变量的修改,* 确保了线程安全。*/


http://www.ppmy.cn/devtools/115158.html

相关文章

第J3-1周:DenseNet算法 实现乳腺癌识别(pytorch)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.8 编译器&#xff1a;Jupyter Notebook 深度学习环境&#x…

如何创建模板提示prompt

定义模型 from langchain_ollama import ChatOllamallm ChatOllama(base_url"http://ip:11434",model"qwen2",temperature0,tool_choice"auto" )什么是提示模板&#xff1f; 它的目的是根据不同的输入动态生成特定格式的文本&#xff0c;以便…

Vue 项目中引入 Axios 详解

Vue 项目中引入 Axios 详解 在 Vue 项目中&#xff0c;axios 是一个非常流行的 HTTP 客户端&#xff0c;用于向服务器发送请求并处理响应。本文将详细说明如何在 Vue 项目中引入 Axios 插件&#xff0c;以及如何进行基本的配置&#xff0c;包括构建、配置域名、设置全局错误拦…

经典sql题(七)查找直播间最大在线人数

使用 SQL 分析房间用户状态变化 本文将详细介绍如何使用 SQL 的窗口函数和聚合函数&#xff0c;分析用户在房间中的状态变化&#xff0c;目标是计算每个房间指定时间段内的最大用户状态。 示例数据 假设我们的数据表包含以下字段&#xff1a; room_iduser_idlogin_timelogo…

禁忌搜索算法(TS算法)求解实例---旅行商问题 (TSP)

目录 一、采用TS求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码&#xff0c;代码&#xff08;完整代码关注底部微信公众号获取&#xff09;**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#x…

ARM/Linux嵌入式面经(三八):绿盟科技

文章目录 @[toc]堆和栈是怎么实现的?基本概念实现方式栈的实现堆的实现面试官的追问堆和栈的运用是怎样运用的、怎样存储的?回答栈(Stack)堆(Heap)深度对比面试官可能的追问Linux系统中进程与进程之间的通信方式有哪些?1. 管道(Pipe)2. 共享内存(Shared Memory)3. 消…

网络安全-ssrf

目录 一、环境 二、漏洞讲解 三、靶场讲解 四、可利用协议 4.1 dict协议 4.2 file协议 4.3 gopher协议 五、看一道ctf题吧&#xff08;长亭的比赛&#xff09; 5.1环境 5.2开始测试 ​编辑 一、环境 pikachu&#xff0c;这里我直接docker拉取的&#xff0c;我只写原…

android 14分屏实战之小米su7的3分屏实现方案讨论及线索征集

背景&#xff1a; hi&#xff0c;粉丝朋友们&#xff1a; 近来有学员朋友询问到了马哥一个问题关于小米su7的分屏实现方案问题&#xff0c;具体小米su7的实现现象如下&#xff1a; 具体源头视频详细地址&#xff1a;https://www.bilibili.com/video/BV1UK421a7iB 针对小米su…