首页 > 后端开发 > C++ > 如何在不使用 Boost 的情况下在 C 0x 中实现信号量?

如何在不使用 Boost 的情况下在 C 0x 中实现信号量?

Barbara Streisand
发布: 2024-12-18 18:55:14
原创
984 人浏览过

How Can I Implement Semaphores in C  0x Without Using Boost?

没有信号量的 C 0x 中的同步

C 0x 引入了原子变量和条件,但缺乏显式信号量支持。这引发了人们对如何在不使用 Boost 信号量实现的情况下有效同步线程的担忧。

一种方法涉及利用互斥体和条件变量的组合来创建自定义信号量。考虑以下示例:

#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;
    }
};
登录后复制

此实现利用互斥体 (mutex_) 来保护对内部数据的访问,并在释放信号量时使用条件变量 (condition_) 向等待线程发出信号。 count_ 成员变量初始化为零,表示初始锁定状态。

要释放信号量(即使其可用于获取),release() 方法会增加计数并通知任何等待线程。要获取信号量,acquire() 方法将等待计数非零。 try_acquire() 方法尝试非阻塞地获取信号量,如果成功则返回 true,否则返回 false。

这种方法提供了一种简单而有效的方法来在 C 0x 中实现信号量,而无需使用 Boost。它的功能与 POSIX 信号量类似,允许线程同步其执行并有效地传达事件。

以上是如何在不使用 Boost 的情况下在 C 0x 中实现信号量?的详细内容。更多信息请关注PHP中文网其他相关文章!

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