美文网首页C++多线程
C++11 实现简单的信号量

C++11 实现简单的信号量

作者: 不动点P | 来源:发表于2020-04-11 21:50 被阅读0次

众所周知C++11并没有给我们提供什么好用一点的并发组件,委员会非常慷慨地给我们留了一堆空白,直到C++20才把这些并发组件给补上。

这里用条件变量和mutex实现一个非常简单的信号量。

首先我们要知道什么是信号量:

信号量是一个持有一个计数器cnt,并且支持 up 和 down 操作的同步器。

up增加cnt变量,并在cnt变量大于0的时候唤醒一个线程,并不会去堵塞线程。

down操作则是反着来,down操作减少cnt变量,并在cnt变量小于0的时候堵塞执行down操作的线程。

class Semaphore{
  int cnt;
  void up(){}
  void down(){}
}

于是我们写的信号量的一个框架就出来了。

首先要注意到的一点是,由于up和down操作都是要修改cnt,而在多线程程序中,只要修改可变变量就必定要加锁,所以我们的up和down操作都需要加锁,这里使用最简单直白的方法加锁。

std::mutex mtx;
std::unique_lock<std::mutex> lock{mtx}

唤醒线程和阻塞线程我们这里就选用条件变量,因为条件变量的wait 和notify_one非常符合要求。

首先是up操作

void Semaphore::up(){
    std::unique_lock<std::mutex> lock{mtx};
    cnt++;
    cv.notify_one();
}

其次是down操作

void Semaphore::down(){
    std::unique_lock<std::mutex> lock{mtx};
    cv.wait(lock, [this]{return cnt > 0;});
    cnt--;
}

相关文章

  • 信号量

    c++11信号量实现[https://blog.csdn.net/zdarks/article/details/4...

  • C++11 实现简单的信号量

    众所周知C++11并没有给我们提供什么好用一点的并发组件,委员会非常慷慨地给我们留了一堆空白,直到C++20才把这...

  • 理解操作系统之信号量的应用

    利用信号量实现进程互斥(模式) 利用信号量实现前驱关系(模式) 利用记录型信号量实现同步(模式) 1.利用信号量实...

  • 一对多回调例程

    在C++11中,借助variadic template,实现最简单的(trivial)的一对多回调。 boost:...

  • 限流算法实现

    并发数限流 1. 计数器并发数限流 2. 信号量(Semaphore) 其实最简单的方法就是用信号量来实现: QP...

  • C++11 实现 Twitter Snowflake

    SnowflakeIdWorker c++11 Twitter Snowflake c++11实现版本 代码位置 ...

  • 哈工大操作系统实验(四)进程同步

    本次实验比较简单,相较于前几届需要在linux0.11 底下实现信号量,这次只需要在linux下写个利用信号量解决...

  • GCD 在swift中的使用

    ##GCD简单介绍 1、Dispatch Semaphores:信号量,可以让我们实现更加复杂的并发控制,防止资源...

  • C++11 std::functional

    [C++11] std::functional C++11中std::functional最常用的就是用来实现函数...

  • 第二章 信号量机制

    3)信号量的基本应用:实现进程互斥; 实现进程间的前趋关系(有序) *互斥信号量注意点: 1.互斥信号量mutex...

网友评论

    本文标题:C++11 实现简单的信号量

    本文链接:https://www.haomeiwen.com/subject/urupmhtx.html