线程同步之信号量--semaphore
semaphore信号量的实现
参考链接
使用了std::mutex
和std::condition_variable
来实现信号量的操作。
在这个实现中,Semaphore类有两个主要的函数:signal()
和wait()
。
- Semaphore构造函数接受一个初始值count,并初始化信号量的计数器。
wait()
函数用于等待信号量,它减少计数器的值并检查是否需要阻塞线程。如果计数器的值小于 0,则调用cond.wait()将当前线程阻塞,直到有其他线程调用signal()函数释放信号量。signal()
函数用于释放信号量,它增加计数器的值并检查是否有等待的线程。如果计数器的值小于等于 0,则调用cond.notify_one()来唤醒一个等待的线程。
总体来说,这个信号量类的实现是基于互斥锁和条件变量的常见方式。它可以用于线程之间的同步和资源的访问控制。
// semaphore.h
#ifndef _SEMAPHORE_H
#define _SEMAPHORE_H
#include <mutex>
#include <condition_variable>
using namespace std;
class Semaphore
{
public:
Semaphore(long count = 0) : count(count) {}
//P操作,阻塞
void wait()
{
unique_lock<mutex> unique(mt);
--count;
if (count < 0)
cond.wait(unique);
}
//V操作,唤醒
void signal()
{
unique_lock<mutex> unique(mt);
++count;
if (count <= 0)
cond.notify_one();
}
private:
mutex mt;
condition_variable cond;
long count;
};
#endif
semaphore信号量的使用
#include <iostream>
#include <thread>
#include "semaphore.h"
Semaphore sema(0); // 初始化为0的信号量
void worker() {
sema.wait(); // 等待信号量变为1
std::cout << "Worker thread is running.\n";
// 执行一些操作...
sema.signal(); // 信号量加1,允许其他线程继续执行
}
int main() {
std::thread t1(worker);
std::thread t2(worker);
t1.join();
t2.join();
return 0;
}
Semaphore与condition_variable的区别
在 C++11 中,Semaphore
(信号量)和condition_variable
(条件变量)都是用于线程同步的工具,但它们的用途略有不同。
Semaphore
用于控制对资源的访问。它提供了一个计数器,可以限制同时访问资源的线程数量。当计数器大于 0 时,线程可以获取资源;当计数器为 0 时,线程将被阻塞,直到有其他线程释放资源。condition_variable
用于等待某个条件的发生。它通常与互斥锁一起使用,以确保在条件满足之前,只有一个线程可以执行等待操作。当条件不满足时,等待的线程将被阻塞;当条件满足时,condition_variable
会通知一个或多个等待的线程。
简单来说,Semaphore
用于限制资源的并发访问,而condition_variable
用于等待某个条件的发生。两者通常结合使用,以实现更复杂的线程同步逻辑。
Do not communicate by sharing memory; instead, share memory by communicating.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)