C++并发之定时互斥(std::timed_mutex)

news2024/11/24 19:09:53

目录

  • 1 概述
  • 2 使用实例
  • 3 接口使用
    • 3.1 construct
    • 3.2 lock
    • 3.3 try_lock
    • 3.4 try_lock_for
    • 3.5 try_lock_until
    • 3.6 unlock

1 概述

  定时互斥是一种时间可锁定的对象,它设计用于在代码的关键部分需要独占访问时发出信号,就像常规互斥一样,但还支持定时尝试锁定请求。
  因此,timed_mutex有两个额外的成员:try_lock_for和try_lock_until。
它保证是一个标准布局类。 标准布局类型是一种具有简单线性数据结构和访问控制的类型,可以很容易地用于与用其他编程语言(如C)编写的代码进行通信.
其类图如下:
在这里插入图片描述

2 使用实例

struct TimedFunction
{
    volatile int counter = 0;
    void fireworks(std::timed_mutex & muxtex)
    {
        while(!muxtex.try_lock_for(std::chrono::milliseconds(200)))
            ;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        ++counter;
        muxtex.unlock();
    }

    void waitUtil(std::timed_mutex & muxtex, int seconds)
    {
        std::chrono::time_point<std::chrono::system_clock> timePoint 
            = std::chrono::system_clock::now() + std::chrono::seconds(seconds);
        std::cerr << "\n\nWait util " << seconds << " seconds... \n";
        if(muxtex.try_lock_until(timePoint))
        {
            muxtex.unlock();
            counter = 10;
        }
        else
            counter = 5;
    }
    void sleepFor(std::timed_mutex & muxtex, int seconds)
    {
        muxtex.lock();
        std::cerr << "\n\nSleep " << seconds << " seconds... \n";
        std::this_thread::sleep_for(std::chrono::seconds(seconds));
        muxtex.unlock();
    }
};

void TimedMutexSuite::try_lock_for()
{
    std::timed_mutex muxtex;
    TimedFunction function;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(&TimedFunction::fireworks, std::ref(function), std::ref(muxtex));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(true, function.counter == 10)
    std::cerr << "function.counter: " << function.counter << std::endl;
}

void TimedMutexSuite::try_lock_until()
{
    std::timed_mutex muxtex;
    TimedFunction function;
    std::thread threads[2];

    threads[0] = std::thread(&TimedFunction::sleepFor, std::ref(function), std::ref(muxtex), 10);
    threads[1] = std::thread(&TimedFunction::waitUtil, std::ref(function), std::ref(muxtex), 5);

    threads[0].join();
    threads[1].join();
    TEST_ASSERT_EQUALS(true, function.counter == 5)

    threads[0] = std::thread(&TimedFunction::sleepFor, std::ref(function), std::ref(muxtex), 5);
    threads[1] = std::thread(&TimedFunction::waitUtil, std::ref(function), std::ref(muxtex), 10);

    threads[0].join();
    threads[1].join();
    TEST_ASSERT_EQUALS(true, function.counter == 10)
}

3 接口使用

3.1 construct

void addCount(std::timed_mutex & mutex, int & count)
{
    mutex.lock();
    count++;
    mutex.unlock();
}

void TimedMutexSuite::construct()
{
    std::timed_mutex muxtex;
    int count = 0;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(addCount, std::ref(muxtex), std::ref(count));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(10, count)   
}

3.2 lock

void TimedMutexSuite::lock()
{
    std::timed_mutex muxtex;
    int count = 10;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(addCount, std::ref(muxtex), std::ref(count));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(20, count)   
}

3.3 try_lock

struct TimedFunction
{
    volatile int counter = 0;
    void add_10k_count(std::timed_mutex & muxtex)
    {
        for(int i = 0; i < 10000; i++)
        {
            if(muxtex.try_lock())
            {
                ++counter;
                muxtex.unlock();
            }
        }
    }
};

void TimedMutexSuite::try_lock()
{
    std::timed_mutex muxtex;
    TimedFunction function;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(&TimedFunction::add_10k_count, std::ref(function), std::ref(muxtex));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(true, function.counter < (10 * 10000))
    std::cerr << "function.counter: " << function.counter << std::endl;
}

3.4 try_lock_for

struct TimedFunction
{
    volatile int counter = 0;

    void fireworks(std::timed_mutex & muxtex)
    {
        while(!muxtex.try_lock_for(std::chrono::milliseconds(200)))
            ;
        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
        ++counter;
        muxtex.unlock();
    }

    void waitUtil(std::timed_mutex & muxtex, int seconds)
    {
        std::chrono::time_point<std::chrono::system_clock> timePoint 
            = std::chrono::system_clock::now() + std::chrono::seconds(seconds);
        std::cerr << "\n\nWait util " << seconds << " seconds... \n";
        if(muxtex.try_lock_until(timePoint))
        {
            muxtex.unlock();
            counter = 10;
        }
        else
            counter = 5;
    }
    void sleepFor(std::timed_mutex & muxtex, int seconds)
    {
        muxtex.lock();
        std::cerr << "\n\nSleep " << seconds << " seconds... \n";
        std::this_thread::sleep_for(std::chrono::seconds(seconds));
        muxtex.unlock();
    }
};
void TimedMutexSuite::try_lock_for()
{
    std::timed_mutex muxtex;
    TimedFunction function;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(&TimedFunction::fireworks, std::ref(function), std::ref(muxtex));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(true, function.counter == 10)
    std::cerr << "function.counter: " << function.counter << std::endl;
}

说明:

  • try_lock_for 如果等待指定时间没有锁定返回false,否则返回true

3.5 try_lock_until

void TimedMutexSuite::try_lock_until()
{
    std::timed_mutex muxtex;
    TimedFunction function;
    std::thread threads[2];

    threads[0] = std::thread(&TimedFunction::sleepFor, std::ref(function), std::ref(muxtex), 10);
    threads[1] = std::thread(&TimedFunction::waitUtil, std::ref(function), std::ref(muxtex), 5);

    threads[0].join();
    threads[1].join();
    TEST_ASSERT_EQUALS(true, function.counter == 5)

    threads[0] = std::thread(&TimedFunction::sleepFor, std::ref(function), std::ref(muxtex), 5);
    threads[1] = std::thread(&TimedFunction::waitUtil, std::ref(function), std::ref(muxtex), 10);

    threads[0].join();
    threads[1].join();
    TEST_ASSERT_EQUALS(true, function.counter == 10)
}

说明:

  • try_lock_until 如果等到指定时间没有锁定返回false,否则返回true

3.6 unlock

void TimedMutexSuite::unlock()
{
    std::timed_mutex muxtex;
    int count = 20;
    std::thread threads[10];
    for(int i = 0; i < 10; i++)
        threads[i] = std::thread(addCount, std::ref(muxtex), std::ref(count));
    for(auto &thread : threads)
        thread.join();
    TEST_ASSERT_EQUALS(30, count)   
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1821357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

树莓派4B学习笔记8:开机自启动Python脚本_kill关闭后台脚本

今日继续学习树莓派4B 4G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1&#xff1a; 紧接着上篇文章学习的串口通信,今日学习如何让树莓派开机…

zabbix自定义监控mysql状态和延迟

zabbix自定义监控mysql状态和延迟 文章目录 zabbix自定义监控mysql状态和延迟zabbix自定义监控mysql状态配置主从配置自定义监控添加监控项添加触发器模拟测试异常 zabbix自定义监控mysql延迟配置自定义监控添加监控项添加触发器测试 zabbix自定义监控mysql状态 配置主从 1.安…

H5漂流瓶交友源码|社交漂流瓶H5源码 附安装教程

H5漂流瓶交友源码|社交漂流瓶H5源码 附安装教程 搭建教程 环境&#xff1a;Nginx 1.20.1-MySQL 5.6.50-PHP-7.3 上传源码至网站根目录&#xff0c;创建并导入数据库 数据库信息修改&#xff1a;/config/database.php 网站运行目录/public 配置文件加入&#xff08;从24行…

PHP和Mysql前后端交互效果实现

一、连接数据库基本函数 mysqli_connect(); 作用&#xff1a;创建数据库连接&#xff0c;打开一个新的mysql的连接。传参顺序&#xff1a;数据库地址、数据库账号、数据库密码 <?phpecho mysqli_connect("localhost",root,root) ?> /*结果&#xff1a;F…

基于springboot实现中山社区医疗综合服务平台系统项目【项目源码+论文说明】

基于springboot实现中山社区医疗综合服务平台系统演示 摘要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;居民信息因为其管理内容繁杂&…

数智技术教学解决方案

前言 随着大数据、云计算、人工智能等技术的迅猛发展&#xff0c;教育领域正迎来一场深刻的变革。这场变革不仅仅是教学方式的转变&#xff0c;更是教育理念、教学模式乃至教育生态系统的重塑。唯众作为教育技术领域的领军企业&#xff0c;深刻认识到数智技术在教学中的重要性&…

2024大交通场景空间策展洞察报告

来源&#xff1a;邻汇吧&万一商管 近期历史回顾&#xff1a; 2024国内工商业储能市场研究报告.pdf 2023幸福企业白皮书.pdf 2024年欧亚地区移动经济报告.pdf 内容供应链变革 2023人工智能与首席营销官&#xff08;CMO&#xff09; AI科技对PC产业的影响.pdf 金融业数据应用…

基于YOLO检测算法(单检测器网络+多视频输入)设计与实现

在单摄像头目标检测的基础上&#xff0c;实现单网络多线程的实时目标检测。 1&#xff0c;应用场景 在安防领域&#xff0c;YOLO的多摄像头实时目标检测应用具有以下特点和优势&#xff1a; 实时性能&#xff1a; YOLO算法以非常高的速度运行&#xff0c;能够实现实时目标检测…

ComfyUI 集成混元DIT(comfyui-hydit)

最近腾讯官方推出了ComfyUI插件comfyui-hydit 。是一个专门为腾讯的 Hunyuan-DiT 模型设计的自定义节点和工作流。本文主要介绍如何通过ComfyUI来运行腾讯新出的支持中文提示词的混元文生图大模型Hunyuan-DiT 环境准备 插件 从腾讯混元DIT 源码库获取插件源码&#xff1a; h…

深圳某老牌地产公司曝3小时裁所有员工

大家好&#xff01; 我是老洪&#xff0c;今日&#xff0c;我偶然间瞥见一则新闻&#xff0c;心头一震&#xff0c;惊讶之情难以言表。 据多家权威媒体纷纷报道&#xff0c;近日&#xff0c;深圳一家历史悠久的地产巨头&#xff0c;竟然在短短三小时内&#xff0c;果断地挥别了…

算法课程笔记——线段树维护哈希

算法课程笔记——线段树维护哈希 提前空出来

苹果AI时代:Apple Intelligence能否守护隐私与未来?

最近&#xff0c;苹果展示了其人工智能底牌&#xff0c;推出了Apple Intelligence(重新定义AI)&#xff0c;这是一套基础模型&#xff0c;将极大地改变苹果消费者使用其产品的方式。 虽然仍需在实际中证明自己&#xff0c;但它是一个强有力的演示&#xff0c;至少从普通用户的…

防火墙对于企业究竟起到哪些作用?

在当今数字化时代&#xff0c;企业网络安全已成为关乎企业生存与发展的战略要务。防火墙作为网络安全的基石&#xff0c;对于构建企业网络的安全防护体系至关重要。本文将深入剖析防火墙在企业网络安全中的多重价值&#xff0c;并结合具体案例&#xff0c;探讨如何科学运用防火…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第40课-实时订阅后端数据

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第40课-实时订阅后端数据 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引…

pdf格式转成jpg图片,pdf格式如何转jpg

pdf转图片的方法&#xff0c;对于许多人来说可能是一个稍显陌生的操作。然而&#xff0c;在日常生活和工作中&#xff0c;我们有时确实需要将pdf文件转换为图片格式&#xff0c;以便于在特定的场合或平台上进行分享、展示或编辑。以下&#xff0c;我们将详细介绍一个pdf转成图片…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战系列教程前言总结

本系列教程的初衷 目前Github和技术社区中有不少功能强大&#xff0c;界面美观的Vue3ElementPlus通用后台管理系统&#xff0c;但这些系统对初学者都不太友好&#xff0c;导致大家学习路径比较陡峭。于是自己写了这个系列&#xff0c;手把手从头开发一个通用后台管理系统的雏形…

Unity 踩坑记录 用自定义类 创建的List不显示在 inspector面板

在 自定义类上面添加 【Serializable 】 扩展&#xff1a; 1&#xff1a;Serializable 序列化的是可序列化的类或结构。并且只能序列化非抽象非泛型的自定义的类 2&#xff1a;SerializeField是强制对私有字段序列化

内网穿透方法有哪些?路由器端口映射外网和软件方案步骤

公网IP和私有IP不能互相通讯。我们通常在局域网内部署服务器和应用&#xff0c;当需要将本地服务提供到互联网外网连接访问时&#xff0c;由于本地服务器本身并无公网IP&#xff0c;就无法实现。这时候就需要内网穿透技术&#xff0c;即内网映射&#xff0c;内网IP端口映射到外…

【StableDiffusion】Prompts 提示词语法;高阶用法;写作顺序是什么,先写什么后写什么

Prompt 写作顺序 第一步&#xff1a;画质词画风词 第一步先写“画质词”和“画风词” 画质词如下&#xff1a; 画风词如下&#xff1a; 第二步&#xff1a;画面主体描述 人物性别、年龄、发型、发色、情绪表情、衣服款式、衣服颜色、动作、饰品、身材、五官微调 第三步&…

探索Gitcode上的热门开源项目:ChatTTS

随着开源程序的发展&#xff0c;越来越多的程序员开始关注并加入开源大模型的行列。开源行业和开源项目对于每个人来说都有不同的关注点&#xff0c;今天&#xff0c;我将向大家推荐一个热门的开源项目——ChatTTS。 ChatTTS是一个基于深度学习技术的开源语音合成项目。它可以将…