【C语言】条件变量(pthread_cond_t)

 一、概述

      条件变量(pthread_cond_t)是POSIX线程(也称为pthread)库中用于线程同步的一种机制。在多线程程序中,条件变量通常与互斥锁(pthread_mutex_t)一起使用,以防止并发问题,如竞态条件和死锁。

二、条件变量(pthread_cond_t)操作函数

1. pthread_cond_init

初始化一个条件变量。

int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);

2. pthread_cond_destroy

销毁条件变量。

int pthread_cond_destroy(pthread_cond_t *cond);

3. pthread_cond_wait

在等待条件变量时,阻塞线程并释放互斥锁。当被pthread_cond_signal或pthread_cond_broadcast唤醒时,线程重新获得锁,并继续执行。

int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);

4. pthread_cond_timedwait

类似于`pthread_cond_wait`,但加入了超时限制。如果条件在超时之前没有得到满足,函数返回一个错误码。

int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);

5. pthread_cond_signal

唤醒至少一个等待给定条件变量的线程。

int pthread_cond_signal(pthread_cond_t *cond);

6. pthread_cond_broadcast

唤醒所有等待给定条件变量的线程。

int pthread_cond_broadcast(pthread_cond_t *cond);

三、互斥锁(pthread_mutex_t)操作函数

1. pthread_mutex_init

初始化一个互斥锁。

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);

2. pthread_mutex_lock

锁定互斥锁。如果已经被锁定,线程将阻塞,直到锁被解锁。

int pthread_mutex_lock(pthread_mutex_t *mutex);

3. pthread_mutex_unlock

解锁互斥锁。

int pthread_mutex_unlock(pthread_mutex_t *mutex);

4. pthread_mutex_destroy

销毁互斥锁。

int pthread_mutex_destroy(pthread_mutex_t *mutex);

四、代码示例

以下是利用条件变量和互斥锁进行线程同步的代码示例:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>// 全局变量
pthread_mutex_t mutex;
pthread_cond_t cond;
int ready = 0;// 线程函数
void* thread_func(void* arg) {// 加锁pthread_mutex_lock(&mutex);// 等待条件变量变为readywhile (!ready) {pthread_cond_wait(&cond, &mutex);}printf("Thread %ld is now running.\n", (long)arg);// 解锁pthread_mutex_unlock(&mutex);return NULL;
}int main(void) {pthread_t thread1, thread2;pthread_mutex_init(&mutex, NULL);pthread_cond_init(&cond, NULL);pthread_create(&thread1, NULL, thread_func, (void*)1);pthread_create(&thread2, NULL, thread_func, (void*)2);sleep(2); // 等待一段时间// 加锁pthread_mutex_lock(&mutex);// 更改条件并唤醒所有等待线程ready = 1;pthread_cond_broadcast(&cond);// 解锁pthread_mutex_unlock(&mutex);pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_cond_destroy(&cond);pthread_mutex_destroy(&mutex);return 0;
}
在代码中,我们创建了两个线程,它们将等待条件变量`ready`变为1。当`main()`函数中将`ready`设置为1并调用`pthread_cond_broadcast`后,所有等待中的线程将被唤醒并继续执行。

五、流程状态图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/154370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

渲染器之挂载与更新

讲解渲染器的核心功能&#xff1a;挂载与更新。 1、挂载子节点和元素的属性 当 vnode.children 的值是字符串类型时&#xff0c;会把它设置为元素的文本内容。一个元素除了具有文本子节点外&#xff0c;还可以包含其他元素子节点&#xff0c;并且子节点可以是很多个。为了描述…

IonQ、Rigetti、D-Wave公布2023年第三季度财报!

近期&#xff0c;量子计算公司Rigetti、IonQ和D-Wave均公布了各自在2023年第三季度的盈利收益。 这三家公司在近期均实现了收入增长&#xff0c;并助力客户实现相应的业务增长。然而&#xff0c;在追求实现量子霸权和超越经典硅基计算机系统的同时&#xff0c;这些公司仍面临着…

ECharts零基础使用思路 图表案例网站推荐

1、用npm安装echarts npm i echarts -S 2、引入 &#xff08;1&#xff09;可以在mian.js里全局引入 import echarts from ‘echarts’ Vue.prototype.$echarts echarts 将echarts挂载在Vue原型上 用时直接this.$echarts即可 &#xff08;2&#xff09;也可以在组件中按需引入…

安卓毕业设计:基于安卓android微信小程序的在线医生答疑系统

项目介绍 在线医生答疑开发使系统能够更加方便快捷&#xff0c;同时也促使在线医生答疑变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。具体在系统设计上&#xff0c;客户端使用微信开发者&#xff0c;后台也使用java技术在动态页面上进行了设计&#xff0c;My…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十五)

介绍 在本系列&#xff0c;我打算花大篇幅讲解我的 gitee 项目音视频播放器&#xff0c;在这个项目&#xff0c;您可以学到音视频解封装&#xff0c;解码&#xff0c;SDL渲染相关的知识。您对源代码感兴趣的话&#xff0c;请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

windows系统 phpstudy 安装 imagick 扩展

其他博客 https://blog.csdn.net/json_ligege/article/details/130227725 1. 下载 imagemagick.org 注意版本对应 官网 https://imagemagick.org/script/download.php#windows github地址 //老版本需要自己编译 https://github.com/ImageMagick/ImageMagick/releases 其他地址…

Linux C 基于tcp多线程在线聊天室

多线程在线聊天室 概述客户端服务端 概述 客户端实现了判单用户登录结果、防止单回车字符发送、保存和显示历史聊天记录&#xff08;仅自己&#xff09;、退出聊天室功能。   服务端实现了验证用户是否已经存在&#xff08;支持最大64用户连接&#xff09;支持广播用户进入退…

自定义类型转换函数operator MyInt()

/*** * 结论&#xff1a;对pass-by-value传参的常规调用&#xff0c;会用实参拷贝构造形参&#xff0c;实参与形参相互无影响&#xff1b; * 当对实参调用类型转换函数(返回形参类型)&#xff0c;编译器会优化代码使类型转换函数返回值直接构造在调用作用域的接受对象上 */ …

AR眼镜方案—单目光波导AR智能眼镜

光波导技术是一项具有前沿意义的技术&#xff0c;它能够将光线反射180度&#xff0c;使得眼镜框架内置的MicroLED屏幕的图像通过多次反射与扩散后准确地传递到人眼中。采用MicroLED显示技术的AR智能眼镜不仅体积显著缩小&#xff0c;屏幕只有0.68英寸大小&#xff0c;并且还能够…

crontab

crontab 详细用法 定时任务_crontab每周六凌晨一点重启-CSDN博客 使用 Crontab 设置开机启动 Python 脚本_crontab开机启动脚本-CSDN博客 编写一个 shell 脚本 $ cat test.sh #!/bin/bashpython3 main.py > ~/output-20230901.txtubuntu环境下开启定时任务crontab_ubuntu…

华为HCIE技术(HCIP、HCIE)汇总

我所在的岗位是网络运维&#xff0c;路由与交换用的比较多&#xff0c;外网技术比较少。所以把经常用的写的比较详细。大家多多包涵。 理论部分 网络基础&#xff1a;ISO网络七层模型 交换机部分 首次Console口登陆配置Telnet访问 VLAN VLAN的介绍、单交换机vlan划分实验…

KT142C语音芯片音乐前要空白音才行,声音会被截掉,实际语音是你好,播放变成好

KT142C语音芯片播放音乐前必须有一段空白音才行&#xff0c;不然声音会被截掉一部分&#xff0c;播放 温度1超高&#xff0c;如果前面没有空白音&#xff0c;就会变成 度1超高 出现这个问题&#xff0c;核心的原理在于功放芯片是受控了 这个问题只存在于&#xff0c;配置为DAC…

软考必须得从初级开始考吗?

软考是指软件技术专业资格考试&#xff0c;是由中国计算机技术职业资格认证中心&#xff08;NCTC&#xff09;主办的一项国家级考试。软考考试内容涵盖了软件工程、数据库、网络与信息安全、嵌入式系统等多个方面的知识&#xff0c;是评价软件技术人员专业水平的重要标准。 对于…

手机 IOS 软件 IPA 签名下载安装详情图文教程

由于某些应用由于某些原因无法上架到 appStore 或者经过修改过的软件游戏等无法通过 appStore 安装&#xff0c;我们就可以使用签名的方式对相应软件的IPA文件进行签名然后安装到你的手机上 这里我们使用爱思助手进行签名安装&#xff0c;爱思助手支持两种方式&#xff0c;一种…

visionOS空间计算实战开发教程Day 1:环境安装和编写第一个程序

安装 截至目前visionOS还未在Xcode稳定版中开放&#xff0c;所以需要下载​​Xcode Beta版​​。比如我们可以下载Xcode 15.1 beta 2&#xff0c;注意Xcode 15要求系统的版本是macOS Ventura 13.5或更新&#xff0c;也就是说2017年的MacBook Pro基本可以勉强一战&#xff0c;基…

从复杂大模型加载到3D PDF发布: EVGET HOOPS Framework如何助力高性能3D桌面应用开发?

在当今数字化时代&#xff0c;3D图形和CAD&#xff08;计算机辅助设计&#xff09;技术在各行各业中扮演着至关重要的角色。 HOOPS SDK是由Tech Soft 3D公司开发的一套强大的3D图形和CAD&#xff08;计算机辅助设计&#xff09;开发工具包。HOOPS致力于提供先进的3D复杂数据处…

艾泊宇产品战略:探索产品战略对品牌价值的重要性

一、流量型广告与认知型广告 大家都知道&#xff0c;在如今的商业环境中&#xff0c;媒体广告主要分为两种&#xff1a;流量型广告和认知型广告。 流量型广告&#xff0c;咱们就把它叫做“伟哥模式” 伟哥你懂的&#xff0c;吃一颗立马见效&#xff0c;效果非凡。但问题是&a…

Codesys扩展数据类型Any的探索

Codesys代码代写&#xff0c;程序开发&#xff0c;软件定制&#xff0c;bug修改&#xff0c;问题咨询&#xff1a; TAO宝搜索店铺【林磊教育】 ANY 定义 Any内部是一个数据结构体&#xff0c;在定义一个Any变量时&#xff0c;内部会转成其结构体&#xff0c;定义如下 TYPE An…

数据结构与算法之美学习笔记:23 | 二叉树基础(上):什么样的二叉树适合用数组来存储?

目录 前言树&#xff08;Tree&#xff09;二叉树&#xff08;Binary Tree&#xff09;二叉树的遍历解答开篇 & 内容小结 前言 本节课程思维导图&#xff1a; 前面我们讲的都是线性表结构&#xff0c;栈、队列、链表等等。今天我们讲一种非线性表结构&#xff0c;树。问题&…

WebGoat通关攻略之 SQL Injection (intro)

SQL Injection (intro) 1. What is SQL? 本题练习SQL查询语句&#xff0c;就是写一句SQL获取叫Bob Franco所在的department SELECT department FROM employees WHERE first_name Bob AND last_name Franco成功通关&#xff01; 2. Data Manipulation Language (DML) 本题…