ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

std::counting_semaphore 练习

2022-02-22 13:04:49  阅读:342  来源: 互联网

标签:std acquire 信号量 semaphore release counting


std::counting_semaphore 具体内容看std::counting_semaphore, std::binary_semaphore - C++中文 - API参考文档 (apiref.com)。其原理和 std::condition_variable 一样,std::counting_semaphore是它的轻量级实现。

简单的说即根据信号量(内部计数器)大于和等于零进行不同的操作,acquire 会让信号量减一,release 会让信号量加一(其它操作看参考文档,和std::condition_variable 大同小异):

  • 大于零,进行 acquire 操作,信号量减一,不会堵塞线程
  • 等于零,进行 acquire 操作,信号量为零,无法再减,堵塞线程,直到 release 操作让信号量加一(大于零),重复上一步

 

下面是循环打印代码

int main(int argc, char* argv[])
{
    system("chcp 65001");

    std::counting_semaphore<2> sem{ 2 };  //  最大信号量为2,可用初始值为2

    std::thread t1([&] {
        while (true)
        {
            sem.acquire();
            cout << "t1\n";
        }
        });

    std::thread t2([&] {
        while (true)
        {
            sem.acquire();
            cout << "t2\n";
        }
        });

    std::thread t3([&] {
        while (true)
        {
            sem.acquire();
            cout << "t3\n";
        }
        });

// t4用于不断 release 增加信号量,若通过 release 操作导致信号量比设定最大值还大,则程序崩溃 std::thread t4([&] { while (true) { std::this_thread::sleep_for(500ms); sem.release(); } }); t1.join(); t2.join(); t3.join(); t4.detach(); cout << "end\n"; return 0; }

 

 

std::binary_semaphore 是模板参数为 1 的 std::counting_semaphore 别名。

标签:std,acquire,信号量,semaphore,release,counting
来源: https://www.cnblogs.com/GEEK-ZHAO/p/15922588.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有