【并发编程十二】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) 是一种轻量的同步原件,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。
定义于头文件<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();
}
- 输出
- 参考:
1、https://www.apiref.com/cpp-zh/cpp/thread.html
2、https://en.cppreference.com/w/cpp/thread
3、书籍《c++服务器开发精髓》——张远龙