(C++20) 信号量 semaphore

📶前言

在多线程编程中,同步和锁是一个庞大的体系。主要是目前有很多成熟的技术和方案。

其中信号量是一个典型的同步机制。而在 C++ 中,直到 C++20 才发布的标准的信号量库。<semaphore>

而另一个类似的方案即互斥量,在 C++11 便已推出。而两者虽然类似,但也有不同,主要为:

  • 互斥量:要求哪个线程获取了互斥量,哪个线程就要负责这个锁。
  • 信号量:可以被系统中一个线程获取后由另一个线程释放。
  • 临界区:仅限于本进程操作,此外性质与互斥量相同。而互斥量和信号量具有多进程可见性。

📶信号量 semaphore

标准库标头 (C++20) - semaphore

std::counting_semaphore, std::binary_semaphore

信号量中有一个特化,也就是二元信号量。在标准中也直接作为一个特化。

using binary_semaphore = std::counting_semaphore<1>;

而常规的N元信号量的操作一般如下:

线程访问资源的时候首先获取信号量

  • 将信号量的值减1。
  • 如果信号量的值小于0,则进入等待状态,否则继续执行。

访问资源之后,线程释放信号量,进行如下操作。

  • 将信号量加1。
  • 如果信号量的值小于1,唤醒一个等待中的线程。
#include <chrono>
#include <iostream>
#include <semaphore>
#include <thread>

// 全局二元信号量实例
// 设置对象计数为零
// 对象处于未被发信状态
std::binary_semaphore smphSignalMainToThread{
   
   0};
std::binary_semaphore smphSignalThreadToMain{
   
   0};

void ThreadProc() {
   
   
    // 通过尝试减少信号量的计数等待来自主程序的信号
    smphSignalMainToThread.acquire
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天赐细莲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值