是否有类似于标准提供的std::lock_guard、std::scoped_lock或std::unique_lock的RAII保护,我可以将其与std::binary_semaphore和std::counting_semaphore结合使用?
std::lock_guard
std::scoped_lock
std::unique_lock
std::binary_semaphore
std::counting_semaphore
ql3eal8s1#
与std::mutex不同,std::counting_semaphore的获取和释放调用可以发生在不同的线程上。因此,我认为在同一作用域中锁定和解锁信号量不是信号量的主要用例。然而,您可以轻松地创建自定义lock_guard,如下所示:
std::mutex
#include <semaphore> #include <iostream> template <typename T> class custom_lock_guard { T &m_; public: custom_lock_guard(T &m) : m_(m) { m_.acquire(); std::cout << "Lock acquired" << std::endl; } ~custom_lock_guard() { m_.release(); std::cout << "Lock released" << std::endl; } }; std::counting_semaphore<10> m(5); std::binary_semaphore n(1); int main() { custom_lock_guard g(m); custom_lock_guard h(n); return 0; }
uqxowvwt2#
你必须等到std::experimental::scope_exit被支持后才能写:
{ m.acquire(); auto guard = std::scope_exit([&]{m.release();}); // other stuff... }
在此之前,您将不得不从自定义实现中解决问题。
2条答案
按热度按时间ql3eal8s1#
与
std::mutex
不同,std::counting_semaphore
的获取和释放调用可以发生在不同的线程上。因此,我认为在同一作用域中锁定和解锁信号量不是信号量的主要用例。然而,您可以轻松地创建自定义lock_guard,如下所示:uqxowvwt2#
你必须等到std::experimental::scope_exit被支持后才能写:
在此之前,您将不得不从自定义实现中解决问题。