【并发编程十二】c++20线程同步——信号量(semaphore)
创始人
2024-05-15 23:08:17

【并发编程十二】c++20线程同步——信号量(semaphore)

  • 一、互斥
  • 二、条件变量
  • 三、future
  • 四、信号量
    • 1、信号量原理
    • 2、c++ 20 信号量
    • 3、demo

简介:
本篇文章,是线程同步的最后一篇。我们详细的介绍下c++标准库提供的线程同步方法——信号量(semaphore)。

一、互斥

参见【并发编程九】c++线程同步——互斥(mutex)

二、条件变量

参见【并发编程十】c++线程同步——条件变量(condition_variable)

三、future

参见【并发编程十一】c++线程同步——future

四、信号量

1、信号量原理

参见我写的另外一篇博文参见【并发编程六】c++进程通信——信号量(semaphore)

c++20和我上面讲解的操作系统提供的信号量区别:

  • 操作系统提供的信号量即可以用作不同进程间同步,又可以用做同一进程间的不同线程同步。
  • c++20提供的信号量,只能用做同一进程间的线程同步。

2、c++ 20 信号量

信号量 (semaphore) 是一种轻量的同步原件,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。

定义于头文件

项目Value
counting_semaphore(C++20)实现非负资源计数的信号量(类模板)
binary_semaphore(C++20)仅拥有二个状态的信号量(typedef)

3、demo

因为c++标准库的信号量是c++20标准。所以,

  • 首先我们需要把visual studio升级为2019,

  • 然后打开c++20支持的开关。(详细可以参见我之前的博客)

  • demo

唤醒3个线程

#include 
#include 
#include 
using namespace std;std::counting_semaphore<3> csem(0);binary_semaphore bsem(0);// semaphore release = condition_variable notify
// semaphore acquire = condition_variable wait
void task()
{cout << "task:ready to recv signal \n";csem.acquire();cout << "task:acquire end\n";
}
int main()
{thread t0(task);thread t1(task);thread t2(task);thread t3(task);thread t4(task);cout << "main:ready to signal :release\n";csem.release(3);cout << "main: signal end\n";t0.join();t1.join();t2.join();t3.join();t4.join();
}
  • 输出

在这里插入图片描述

  • 参考:
    1、https://www.apiref.com/cpp-zh/cpp/thread.html
    2、https://en.cppreference.com/w/cpp/thread
    3、书籍《c++服务器开发精髓》——张远龙

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
阿西吧是什么意思 阿西吧相当于... 即使你没有受到过任何外语培训,你也懂四国语言。汉语:你好英语:Shit韩语:阿西吧(아,씨발! )日...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...