线程同步之信号量--semaphore


semaphore信号量的实现

参考链接
使用了std::mutexstd::condition_variable来实现信号量的操作。
在这个实现中,Semaphore类有两个主要的函数:signal()wait()

  1. Semaphore构造函数接受一个初始值count,并初始化信号量的计数器。
  2. wait()函数用于等待信号量,它减少计数器的值并检查是否需要阻塞线程。如果计数器的值小于 0,则调用cond.wait()将当前线程阻塞,直到有其他线程调用signal()函数释放信号量。
  3. 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用于等待某个条件的发生。两者通常结合使用,以实现更复杂的线程同步逻辑。

posted @   guanyubo  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示