【TinyWebServer】线程同步封装

目录

POSIX信号量

int sem_init(sem_t* sem,int pshared,unsingned int value);

int sem_destroy(sem_t* sem);

 int sem_wait(sem_t* sem);

 int sem_post(sem_t* sem);

互斥量

条件变量

为了对多线程程序实现同步问题,可以用信号量POSIX信号量、互斥量、条件变量进行线程同步,以达到对共享资源的最大利用。

POSIX信号量

POSIX信号量由sem_ 开头,主要有五个信号量函数。

int sem_init(sem_t* sem,int pshared,unsingned int value);

pshared参数指定信号量的类型,如果为0则代表这个信号量是这个线程局部信号量,否则该信号量就会在多个线程之间共享。

value参数指定信号量的初始值。

不能初始化一个已经被初始化的信号量!!!

int sem_destroy(sem_t* sem);

用于销毁信号量,释放其占用的内核资源

 int sem_wait(sem_t* sem);

以原子操作的方式将信号量的值减1,如果信号量为0则被阻塞,知道该信号量具有非0值

 int sem_post(sem_t* sem);

//以原子操作方式将信号量加一,信号量大于0时,唤醒调用sem_post的线程

#include<semaphore.h>//用于初始化一个未命名的信号量
int sem_init(sem_t* sem,int pshared,unsingned int value);//用于销毁信号量
int sem_destroy(sem_t* sem);//用以原子操作方式将信号量减一,信号量为0时,sem_wait阻塞
int sem_wait(sem_t* sem);//相当于sem_wait的非阻塞版本,直接立即返回信号量,无论其是否为0
int sem_trywait(sem_t* sem);//以原子操作方式将信号量加一,信号量大于0时,唤醒调用sem_post的线程
int sem_post(sem_t* sem);
class sem
{
public:sem(){if (sem_init(&m_sem, 0, 0) != 0){throw std::exception();}}sem(int num){if (sem_init(&m_sem, 0, num) != 0){throw std::exception();}}~sem(){sem_destroy(&m_sem);}bool wait(){return sem_wait(&m_sem) == 0;}bool post(){return sem_post(&m_sem) == 0;}private:sem_t m_sem;
};

互斥量

互斥锁,也成互斥量,可以保护关键代码段,以确保独占式访问.当进入关键代码段,获得互斥锁将其加锁;离开关键代码段,唤醒等待该互斥锁的线程.

#include<pthread.h>//用于初始化互斥锁
int pthread_mutex_init(pthread_mutex_t* mutex,const pthread_mutexattr* mutexattr);//用于销毁互斥锁
int pthread_mutex_destroy(pthread_mutex* mutex);//以原子操作方式给互斥锁加锁
int pthread_mutex_lock(pthread_mutex_t* mutex);//以原子操作方式给互斥锁解锁
int pthread_mutex_unlock(pthread_mutex_t* mutex);
class locker
{
public:locker(){if (pthread_mutex_init(&m_mutex, NULL) != 0){throw std::exception();}}~locker(){pthread_mutex_destroy(&m_mutex);}bool lock(){return pthread_mutex_lock(&m_mutex) == 0;}bool unlock(){return pthread_mutex_unlock(&m_mutex) == 0;}pthread_mutex_t *get(){return &m_mutex;}private:pthread_mutex_t m_mutex;
};

条件变量

条件变量提供了一种线程间的通知机制,当某个共享数据达到某个值时,唤醒等待这个共享数据的线程.

#include<pthread.h>//用于初始化条件变量
int pthread_cond_init(pthread_cond_t* cond,const pthread_condatte_t* cond_attr);//用于销毁条件变量
int pthread_cond_destroy(pthread_cond_t* cond);//以广播的方式唤醒所有等待目标条件变量的线程
int pthread_cond_broadcast(pthread_cond_t* cond)/*用于等待目标条件变量.该函数调用时需要传入 mutex参数(加锁的互斥锁) ,函数执行时,先把调用线程放入条件变量的请求队列,然后将互斥锁mutex解锁,当函数成功返回为0时,互斥锁会再次被锁上. 也就是说函数内部会有一次解锁和加锁操作.*/
int pthread_cond_signal(pthread_cond_t* cond);//用于等待目标条件变量,mutex参数是用于保护条件变量的互斥锁
int pthread_cond_wait(pthread_cond_t* cond,pthread_mutex_t* mutex);
class cond
{
public:cond(){if (pthread_cond_init(&m_cond, NULL) != 0){//pthread_mutex_destroy(&m_mutex);throw std::exception();}}~cond(){pthread_cond_destroy(&m_cond);}bool wait(pthread_mutex_t *m_mutex){int ret = 0;//pthread_mutex_lock(&m_mutex);ret = pthread_cond_wait(&m_cond, m_mutex);//pthread_mutex_unlock(&m_mutex);return ret == 0;}bool timewait(pthread_mutex_t *m_mutex, struct timespec t){int ret = 0;//pthread_mutex_lock(&m_mutex);ret = pthread_cond_timedwait(&m_cond, m_mutex, &t);//pthread_mutex_unlock(&m_mutex);return ret == 0;}bool signal(){return pthread_cond_signal(&m_cond) == 0;}bool broadcast(){return pthread_cond_broadcast(&m_cond) == 0;}private://static pthread_mutex_t m_mutex;pthread_cond_t m_cond;
};

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

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

相关文章

打造高效多模态RAG系统:原理与评测方法详解

引言 随着信息检索与生成式AI的深度融合&#xff0c;检索增强生成&#xff08;RAG, Retrieval-Augmented Generation&#xff09; 已成为AI领域的重要技术方向。传统RAG系统主要依赖文本数据&#xff0c;但真实世界中的信息往往包含图像、表格等多模态内容。多模态RAG&#xf…

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目录 云计算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安装位置2.软件名和软件包名3.查询软件信息4.查询软件包5.导入红帽签名信息&#xff0c;解决查询软件包信息报错6.利用…

【图像处理3D】:点云图是怎么生成的

点云图是怎么生成的 **一、点云数据的采集方式****1. 激光雷达&#xff08;LiDAR&#xff09;****2. 结构光&#xff08;Structured Light&#xff09;****3. 双目视觉&#xff08;Stereo Vision&#xff09;****4. 飞行时间相机&#xff08;ToF Camera&#xff09;****5. 其他…

javaweb -html -CSS

HTML是一种超文本标记语言 超文本&#xff1a;超过了文本的限制&#xff0c;比普通文本更强大&#xff0c;除了文字信息&#xff0c;还可以定义图片、音频、视频等内容。 标记语言&#xff1a;由标签"<标签名>"构成的语言。 CSS:层叠样式表&#xff0c;用于…

pyinstaller 安装 ubuntu

安装命令 pip install pyinstaller 读取安装路径 ➜ ~ find ~/.local/ -name pyinstaller/home/XXX/.local/bin/pyinstaller 路径配置 vi ~/.zshrc 添加到文件最后 export PATH"$PATH:/home/XXX/.local/bin/" 查看版本号 ➜ ~ source ~/.zshrc➜ ~ pyi…

【前端】掌握HTML/CSS宽高调整:抓住问题根源,掌握黄金法则

一、宽高控制的「黄金法则」 问题根源&#xff1a;为什么设置了宽高没效果&#xff1f; <!-- 典型失败案例 --> <style>.problem-box {width: 200px;height: 100px;padding: 20px; /* 实际变成240x140px&#xff01; */border: 5px solid red; /* 最终250x150px&…

LuaJIT2.1 和 Lua5.4.8 性能对比

说明 最近在学习 LuaJIT&#xff0c;想看看把它接入到项目中使用&#xff0c;会提高多大的性能。 今天抽时间&#xff0c;简单地测试了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 测试平台&#xff1a; 系统&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core™ i7-8700 CPU…

Arduino学习-按键灯

哎&#xff0c;别笑&#xff0c;总比刷抖音强点吧 1、效果 2、代码 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…

强化学习鱼书(10)——更多深度强化学习的算法

&#xff1a;是否使用环境模型&#xff08;状态迁移函数P(s’|s,a)和奖 励函数r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用环境模型的方法叫作无模型&#xff08;model-free&#xff09;的方法&#xff0c;使用环境模型的方法叫作有模型&#xff08;model-based&#…

9.axios底层原理,和promise的对比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的对比 完全可以直接使用 Promise 来发 HTTP 请求&#xff0c;比如用原生 fetch Promise 就可以实现网络请求功能&#x1f447; ✅ 用 Promise fetch 的写法&#xff08;原生&#xff09; fetch(‘https://api.example.c…

什么是数据孤岛?如何实现从数据孤岛到数据共享?

目录 一、数据孤岛是什么&#xff1f; &#xff08;一&#xff09;数据孤岛的定义 &#xff08;二&#xff09;数据孤岛怎么形成的 二、数据孤岛带来的问题 &#xff08;一&#xff09;数据冗余和不一致 &#xff08;二&#xff09;决策效率低下 &#xff08;三&#xf…

MQTT入门实战宝典:从零起步掌握物联网核心通信协议

MQTT入门实战宝典&#xff1a;从零起步掌握物联网核心通信协议 前言 物联网时代&#xff0c;万物互联已成为现实&#xff0c;而MQTT协议作为这个时代的"数据总线"&#xff0c;正默默支撑着从智能家居到工业物联的各类应用场景。本文将带你揭开MQTT的神秘面纱&#…

I2C通信讲解

I2C总线发展史 怎么在一条串口线上连接多个设备呢&#xff1f; 由于速度同步线是由主机实时发出的&#xff0c;所以主机可以按需求修改通信速度&#xff0c;这样在一条线上可以挂接不同速度的器件&#xff0c;单片机和性能差的器件通信&#xff0c;就输出较慢的脉冲信号&#x…

Windows 10 IoT 系统深度定制指南:从环境搭建到工业部署

目录 一、Windows 10 IoT 架构特性与版本选型 1.1 核心架构设计 1.2 版本对比与选型建议 二、开发环境搭建与硬件适配 2.1 工具链配置 2.2 硬件适配关键步骤 三、系统定制流程详解 3.1 镜像定制&#xff08;IoT Core Dashboard&#xff09; 3.2 使用ICD&#xff08;Im…

k8s开发webhook使用certmanager生成证书

1.创建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate&#xff08;自动生成 TLS 证书&#xff09; apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:从入门到企业级实战

MyBatis-Plus深度全解&#xff1a;从入门到企业级实战 一、为什么选择MyBatis-Plus&#xff1f; 1.1 MyBatis的痛点 - 重复CRUD代码编写 - 分页功能实现复杂 - 缺少通用Service层封装 - 动态表名支持困难 - 多租户方案需自行实现1.2 MyBatis-Plus核心优势 无侵入&#xff1a…

【无标题】路径着色问题的革命性重构:拓扑色动力学模型下的超越与升华

路径着色问题的革命性重构&#xff1a;拓扑色动力学模型下的超越与升华 一、以色列路径着色模型的根本局限 mermaid graph TB A[以色列路径着色模型] --> B[强连通约束] A --> C[仅实边三角剖分] A --> D[静态色彩分配] B --> E[无法描述非相邻关系] C --> F[忽…

01 Deep learning神经网络的编程基础 二分类--吴恩达

二分类 1. 核心定义 二分类任务是监督学习中最基础的问题类型&#xff0c;其目标是将样本划分为两个互斥类别。设样本特征空间为 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn&#xff0c;输出空间为 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1}&#xff0c;学习目标为…

数据结构:递归:泰勒展开式(Taylor Series Expansion)

目录 第一步&#xff1a;❓我们要解决什么&#xff1f; 第二步&#xff1a;将其类比为求自然数和 第三步&#xff1a;什么是每一项&#xff1f; 第四步&#xff1a;定义要计算的每一项&#xff08;term&#xff09; 第五步&#xff1a;定义递归函数结构 &#x1f333; 调用…