飞道的博客

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

429人阅读  评论(0)

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

一、互斥

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

二、条件变量

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

三、future

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

四、信号量

1、信号量原理

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

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

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

2、c++ 20 信号量

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

定义于头文件<semaphore>

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

3、demo

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

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

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

  • demo

唤醒3个线程

#include <iostream>
#include <semaphore>
#include <thread>
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();
}

 
  • 输出


转载:https://blog.csdn.net/junxuezheng/article/details/128650064
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场