详细介绍一下C++ 的binary_semaphore ,并给出例子
时间: 2024-03-10 10:45:41 浏览: 298
C++20 引入了一个新的线程同步原语,即 binary_semaphore,它是一个二元信号量,只有两种状态:可用和不可用。binary_semaphore 通过 wait() 和 signal() 操作实现线程间的同步。
binary_semaphore 的等待操作 wait(),是一个阻塞操作,如果当前 semaphore 的状态是不可用的,则等待线程会被阻塞,直到 semaphore 可用;如果当前 semaphore 的状态是可用的,则 wait() 操作将会将 semaphore 的状态设置为不可用,并立即返回。
binary_semaphore 的释放操作 signal(),将会将 semaphore 的状态设置为可用。
以下是一个简单的 binary_semaphore 使用示例:
```c++
#include <iostream>
#include <thread>
#include <semaphore>
std::binary_semaphore sem(1); // 初始化为可用状态
void worker(int id) {
sem.acquire(); // 等待 semaphore 可用
std::cout << "Worker " << id << " acquired the semaphore" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::cout << "Worker " << id << " releasing the semaphore" << std::endl;
sem.release(); // 释放 semaphore
}
int main() {
std::thread t1(worker, 1);
std::thread t2(worker, 2);
t1.join();
t2.join();
std::cout << "Main thread exiting" << std::endl;
return 0;
}
```
在上面的示例中,我们创建了一个 binary_semaphore 对象 sem,初始化为可用状态。然后我们创建了两个 worker 线程,它们通过 acquire() 等待 semaphore 可用,并在获取到 semaphore 后执行一些任务,最后通过 release() 释放 semaphore。由于我们只创建了一个 binary_semaphore 对象,所以这两个线程会依次执行。在主线程中,我们等待两个 worker 线程执行完毕,然后退出程序。
阅读全文