首页 > 后端开发 > C++ > 可以使用互斥体和条件变量来模拟 C 0x 信号量吗?

可以使用互斥体和条件变量来模拟 C 0x 信号量吗?

DDD
发布: 2024-12-26 08:08:12
原创
116 人浏览过

Can C  0x Semaphores Be Emulated Using Mutexes and Condition Variables?

你能在 C 0x 中使用信号量吗?

基于信号量的同步对于线程通信至关重要。在 C 0x 中没有信号量的情况下,这似乎是一个死锁。

使用互斥体和条件变量进行信号量模拟

幸运的是,可以使用互斥体重新创建信号量和一个条件变量。这是一个简单的实现:

#include <mutex>
#include <condition_variable>

class semaphore {
    std::mutex mutex_;
    std::condition_variable condition_;
    unsigned long count_ = 0; // Initialized as locked.

public:
    void release() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        ++count_;
        condition_.notify_one();
    }

    void acquire() {
        std::unique_lock<decltype(mutex_)> lock(mutex_);
        while(!count_) // Handle spurious wake-ups.
            condition_.wait(lock);
        --count_;
    }

    bool try_acquire() {
        std::lock_guard<decltype(mutex_)> lock(mutex_);
        if(count_) {
            --count_;
            return true;
        }
        return false;
    }
};
登录后复制

此模拟提供了信号量的基本行为:

  • release() 发出可能正在等待信号量的事件信号。
  • acquire() 在继续之前等待信号执行。
  • try_acquire() 检查并获取许可(如果可用),而不阻塞。

以上是可以使用互斥体和条件变量来模拟 C 0x 信号量吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板