简介:
本篇文章,是线程同步的最后一篇。我们详细的介绍下c++标准库提供的线程同步方法——信号量(semaphore)。
参见【并发编程九】c++线程同步——互斥(mutex)
参见【并发编程十】c++线程同步——条件变量(condition_variable)
参见【并发编程十一】c++线程同步——future
参见我写的另外一篇博文参见【并发编程六】c++进程通信——信号量(semaphore)
c++20和我上面讲解的操作系统提供的信号量区别:
信号量 (semaphore) 是一种轻量的同步原件,用于制约对共享资源的并发访问。在可以使用两者时,信号量能比条件变量更有效率。
定义于头文件
| 项目 | Value |
|---|---|
| counting_semaphore(C++20) | 实现非负资源计数的信号量(类模板) |
| binary_semaphore(C++20) | 仅拥有二个状态的信号量(typedef) |
因为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();
}