首页 > 其他分享 >条件变量同步

条件变量同步

时间:2023-11-13 11:11:05浏览次数:26  
标签:std 同步 变量 thread int lock nDevice 条件 Logger

#include <thread> #include <iostream> #include "glock.h" #include "mylogger.h" extern std::mutex g_mtx; extern std::mutex g_mtx_main; extern std::condition_variable cvMain; extern std::condition_variable cvWorker; extern int g_numThreads;
int nDevice = 3;
bool allThreadsCompleted = false;
void controlThreadFunction(int id, int casesize, int devicesize, bool bstop = false) {     std::cout << "contorl Thread " << id << " is running." << std::endl;
    int index = 0;     int nCount = casesize;     while (!bstop && index++ < casesize) {         {             std::unique_lock<std::mutex> lock(g_mtx);
            // 设置工作线程数量             g_numThreads = devicesize;             // 重置标志             allThreadsCompleted = false;         }
        // 主线程等待所有工作线程完成         Logger::getInstance().logToConsole("controlthread:main thread wait workthread");         {             std::unique_lock<std::mutex> lock(g_mtx);             cvMain.wait(lock, [] { return allThreadsCompleted; });         }

  

  // 短暂的延时,留出时间确保所有工作线程都进入等待状态
  std::this_thread::sleep_for(std::chrono::milliseconds(1000))


        // 主线程通知所有工作线程可以继续         Logger::getInstance().logToConsole("controlthread:main thread notify all sub-work thread");         cvWorker.notify_all();     }
    Logger::getInstance().logToConsole("controlthread:exit");
}
void workerThreadFunction(int id, int casesize, int devicesize, bool bstop = false) {     int nCount = casesize;     std::this_thread::sleep_for(std::chrono::seconds(2));     for (int index = 0; index < nCount; ++index) {         Logger::getInstance().logToConsole("workerthread:.......do somethings ...." + std::to_string(index) + "_thread:" + std::to_string(id));
        {             std::lock_guard<std::mutex> lock(g_mtx);             g_numThreads--;    // 设置标志表示所有工作线程完成
            if (g_numThreads == 0) {                 allThreadsCompleted = true;                 cvMain.notify_one();  // 通知主线程                 Logger::getInstance().logToConsole("workerthread:.......notify main thread " + std::to_string(index) + "_thread:" + std::to_string(id));             }         }         Logger::getInstance().logToConsole("workerthread:.......wait main thread notify " + std::to_string(index) + "_thread:" + std::to_string(id));
        // 进入等待,等待主线程通知         {             std::unique_lock<std::mutex> lock(g_mtx);             cvWorker.wait(lock);         }     }
    Logger::getInstance().logToConsole("workthread:exit"); }     int main() {
    //Logger& ins = Logger::getInstance();
    //nDevice     //std::thread threads[3];
    g_numThreads = 3;
    std::thread control_thread = std::thread(controlThreadFunction, 1+ nDevice, 3, nDevice,false);     std::vector<std::thread> threads;
    for (int i = 0; i < nDevice; ++i) {         threads.emplace_back(workerThreadFunction, i + 1, 3, nDevice, false);     }
    //for (int i = 0; i < nDevice; ++i) {     //    threads[i] = std::thread(workerThreadFunction, i + 1,2, nDevice,false);     //}

    control_thread.join();
    for (int i = 0; i < nDevice; ++i) {         threads[i].join();     }

    std::cout << "All threads have finished." << std::endl; }

标签:std,同步,变量,thread,int,lock,nDevice,条件,Logger
From: https://www.cnblogs.com/denli/p/17828709.html

相关文章

  • 同步文件夹时 如何选择一款高效稳定的同步软件?
    企业的数据每年都是呈爆发式的增长,并且分散在企业各个服务器或者业务系统上,而在日常经营中,企业与外部合作方之间,或者是总分支机构之间,都是需要进行频繁的数据交互的。所以越来越多的企业要求内部各种业务数据在服务器、数据中心甚至云上能够有实时的同步留存,这就产生了同步文件夹......
  • 4 种 MySQL 同步 ES 方案
    本文会先讲述数据同步的4种方案,并给出常用数据迁移工具1.前言在实际项目开发中,我们经常将MySQL作为业务数据库,ES作为查询数据库,用来实现读写分离,缓解MySQL数据库的查询压力,应对海量数据的复杂查询。这其中有一个很重要的问题,就是如何实现MySQL数据库和ES的数据同步,......
  • 基于costas环的载波同步系统matlab性能仿真
    1.算法运行效果图预览  2.算法运行软件版本matlab2022a  3.算法理论概述       基于Costas环的载波同步系统是一种用于恢复接收信号的载波频率和相位同步的系统。Costas环是一种特殊的环路锁相环路,广泛用于调制解调器、无线通信和雷达等领域。以下是基于C......
  • mysql主从同步延时解决
    ......
  • MATLAB中的路径可以设置为变量
    MATLAB中的路径可以设置为变量,比如:%======'.csv'文件的路径赋值给变量filename_csvfilename_csv='I:\two-parallel-spherical-particles-settlement\no-PoiseuilleSettlement-distance-P0\distance-0.2d1\postProcessing\front_surface_pressure_005.csv';%======通......
  • 无涯教程-Dart - 条件判断
    条件语句在执行指令之前先判断条件。下表中对Dart中的条件构造进行了分类。Sr.NoStatement&描述1ifstatementif语句包含一个布尔表达式,后跟一个或多个语句。2If...ElseStatement一个if后面可以是一个可选的else块。如果if块测试的布尔表达式判断为false,......
  • 无涯教程-Dart - 变量声明
    变量是内存中的命名空间用于存储值。必须先声明变量,然后才能使用它,Dart使用var关键字实现相同的目的。声明变量的语法如下:varname='Smith';dart中的所有变量都存储对值的引用,而不是包含值,名为name的变量包含对值为"Smith"的String对象的引用。Dart通过在变量名称前添加数......
  • 当多条件统计遇到多列
    问题:Countifs其中一个条件区域是多列公式如何写?  体力活=COUNTIFS(R:R,X2,S:S,"未打卡")+COUNTIFS(R:R,X2,T:T,"未打卡")+COUNTIFS(R:R,X2,U:U,"未打卡")+COUNTIFS(R:R,X2,V:V,"未打卡")电脑体力活  =SUM((R$2:R$17=X2)*(S$2:V$17="未打卡"))技术活......
  • 【Python编程】深入理解条件语句:if、else、elif详解
    在Python编程中,条件语句是一种非常重要的控制结构,可以用于根据特定条件执行不同的代码块。本文将深入探讨if、else和elif条件语句的用法,并通过详细的代码案例来帮助您更好地理解它们。一、if语句if语句用于根据特定条件执行代码块。如果条件为真,则执行if语句下面的代码块;如果条件为......
  • 云盘转NAS,云盘转化为本地磁盘,跨平台跨设备同步-CarlZeng
    title:云盘转NAS,云盘转化为本地磁盘,跨平台跨设备同步-CarlZengtags:[NAS,云盘,下载,docker,NginxProxyManager]categories:-云盘-NAS-Docker-NginxProxyManagerdate:2023-08-2621:04:00背景对软路由硬件J4125之类的痴迷,......