std::counting_semaphore 在成员中怎么用?
时间: 2024-02-13 22:07:09 浏览: 124
coma:C ++ 20 asynccoroutineconcurrency原始函数
`std::counting_semaphore` 是 C++20 新增的同步原语之一,用于控制多个线程间的访问。它是一个计数信号量,可以用来限制同时访问某个资源的线程数量。在类的成员中使用 `std::counting_semaphore` 与在其他地方使用它并没有本质的区别,只需要在类的定义中声明一个 `std::counting_semaphore` 类型的成员即可。
以下是一个简单的示例代码:
```c++
#include <semaphore>
#include <thread>
#include <iostream>
class Example {
public:
Example() : sema_(2) {}
void do_something() {
sema_.acquire();
std::cout << "Doing something..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
sema_.release();
}
private:
std::counting_semaphore<2> sema_;
};
int main() {
Example e;
std::thread t1(&Example::do_something, &e);
std::thread t2(&Example::do_something, &e);
std::thread t3(&Example::do_something, &e);
t1.join();
t2.join();
t3.join();
return 0;
}
```
在这个例子中,`Example` 类中定义了一个 `std::counting_semaphore<2>` 类型的成员 `sema_`,用于控制同时访问 `do_something` 函数的线程数量。在 `do_something` 函数中,线程首先需要调用 `acquire()` 函数获取信号量,如果当前已经有两个线程在访问,则该线程会被阻塞,直到有一个线程调用了 `release()` 函数释放了信号量。在主函数中,我们创建了三个线程来同时访问 `do_something` 函数,由于信号量的数量是 2,因此最多只有两个线程能够同时访问,第三个线程需要等待前面的线程释放信号量后才能继续执行。
阅读全文