原子操作实现信号量的示例代码
时间: 2023-08-18 17:10:36 浏览: 157
以下是使用原子操作实现信号量的示例代码,假设需要实现一个二元信号量(即只有0和1两种状态):
```
#include <atomic>
class Semaphore {
public:
Semaphore(int init_count = 0) : m_count(init_count) {}
void wait() {
while (true) {
int old_count = m_count.load();
if (old_count == 0) continue;
if (m_count.compare_exchange_weak(old_count, old_count - 1)) break;
}
}
void signal() {
m_count++;
}
private:
std::atomic<int> m_count;
};
```
这个实现中使用了`std::atomic`类型和原子操作`compare_exchange_weak()`来实现线程安全的信号量操作。在`wait()`方法中,使用循环不断地检查当前计数器的值,如果为0则继续等待,否则使用`compare_exchange_weak()`原子操作尝试将计数器减1,如果操作成功(即当前计数器的值与旧值相同),则退出循环,否则继续重试。在`signal()`方法中,直接将计数器加1即可。
这个实现可以保证多线程环境下信号量的正确性,并且避免了使用锁带来的性能问题。需要注意的是,不同的编译器和操作系统可能对原子操作的支持有所差异,因此在具体使用时需要仔细查阅相关文档和API。
阅读全文