《C++多线程Demo》

  多线程访问共享资源时,采取对资源加锁的方式来防止产生脏数据和错误。多线程访问同一个数据库时,数据库是共享资源,所以对库操作要加锁。对于操作同一个数据结构对象的时候也是一样的。

Key Words:C++多线程、map接收线程结果

Beijing, 2020

作者:RaySue

Agile Pioneer  

定义线程函数

  用map接受线程返回数据, 这里介绍一种场景比较简单的多线程结果汇总的用法,使用map对多线程的结果进行收集,在线程读写的map的时候加锁。

#include<mutex>std::mutex mtx;void threadClsTask(int begin, int end, vector<Mat> imgList, BSMobileNet *bsMobileNet, map<int, int> *bsInfo){int clsRes = bsMobileNet->inference(imgList[begin]);mtx.lock();bsInfo->insert(pair<int, int>(begin, clsRes));mtx.unlock();
}void threadWEBSTask(int begin, int end, vector<Mat> imgList, WEBSAlg *wsICNet, map<int, WE_BS_Res> *wsInfo){WE_BS_Res weBsRes;wsICNet->inference(imgList[begin], weBsRes);mtx.lock();wsInfo->insert(pair<int, WE_BS_Res>(begin, weBsRes));mtx.unlock();
}

多线程调用

int algThreadNum = 6;
std::thread threads[algThreadNum];
map<int, int> *bsInfo = new map<int, int>();
map<int, float> *wsInfo = new map<int, float>();threads[0] = thread(threadClsTask, 0, 0, imgList, &bsMobileNet1, bsInfo);
threads[1] = thread(threadSegTask, 0, 0, imgList, &wsICNet1, wsInfo);threads[2] = thread(threadClsTask, 1, 1, imgList, &bsMobileNet2, bsInfo);
threads[3] = thread(threadSegTask, 1, 1, imgList, &wsICNet2, wsInfo);threads[4] = thread(threadClsTask, 2, 2, imgList, &bsMobileNet3, bsInfo);
threads[5] = thread(threadSegTask, 2, 2, imgList, &wsICNet3, wsInfo);for (auto &t : threads){t.join();
}delete bsInfo;
delete wsInfo;

  多线程的互斥情况在代码编写过程中是经常遇到的。所以,每次对共享数据进行操作时,都需要对数据进行 EnterCriticalSection 和 LeaveCriticalSection 的操作。但是,这中间也不是一帆风顺的。很有可能你会遇到各种各样的错误。那么,这时候你的程序就需要跳出去了。可能一开始遇到 error 的时候,你还记得需要退出临界区。但是,如果错误多了,你未必记得还有这个操作了。这一错就完了,别的线程就没有机会获取这个锁了。

  C++ 的一个重要特点就是,不管函数什么时候退出,系统都会自动调用类的析构函数。在Process类的data_process函数中,函数在开始就创建了一个CLock类。那么,在创建这个类的时候,其实就开始了临界区的pk。那么一旦进入到临界区当中,在error中能不能及时退出临界区呢?此时,c++析构函数的优势出现了。因为不管错误什么时候出现,在函数退出之前,系统都会帮我们善后。什么善后呢?就是系统会调用CLock的析构函数,也就是退出临界区。这样,我们的目的就达到了。

《c++并发编程实战》
c++实现线程安全的map
https://blog.csdn.net/eulb/article/details/2177500
https://blog.csdn.net/zkkdcs1/article/details/89400259

C++多线程Demo相关推荐

  1. Python简单的多线程demo:装逼写法

    Python简单的多线程demo:装逼写法 用面向对象来写多线程: import threadingclass MyThread(threading.Thread):def __init__(self ...

  2. java线程 demo_Java多线程demo

    近期考虑采用Java多线程实现给用户发短信的功能.自己做了一个简单的demo. demo需求如下:通过界面输入用户名.密码.手机号,点击添加,即可实时的为该用户发一条短信. 实现过程如下: 2.点击& ...

  3. 程序模拟电影院窗口卖票,多线程Demo

    某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 卖电影票Demo 实现步骤 1.SellTicket类 2.SellTicketDemo测试类 3.测 ...

  4. 有返回值的多线程demo

    package com.jimmy.demo.util; import java.util.HashMap;import java.util.concurrent.*;import java.util ...

  5. vs c语言 多线程demo,一个多线程的Socket通信Demo(C语言实现)

    -----------这是客户端程序-------------- #include "stdio.h" #include "winsock2.h" #inclu ...

  6. Java多线程Demo

    三个Java多线程循环打印递增的数字,每个线程打印5个数值,打印周期1-75 1)打印数值线程类 package com.volitation.bigdata.holder.thread;import ...

  7. Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)

    JAVA Socket简介 所谓socket 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答 ...

  8. QMainWindow多线程demo

    # -*- coding: utf-8 -*- from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * im ...

  9. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

最新文章

  1. 认识计算机系统反思,《认识计算机系统》教学反思
  2. HDU 1231 最大连续子序列:水dp
  3. Map.putAll方法——追加另一个Map对象到当前Map集合
  4. java8之list集合中取出某一属性的方法
  5. cgi java编程_Java的CGI数据编码改如何编写
  6. NLP(三) 预处理
  7. 深度学习(三):初级卷积神经网络
  8. 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
  9. onCreateView中加载大位图
  10. 分享一款思维导图工具-幕布(附在线工具合集、Android进阶知识体系)
  11. QT相关内容的下载链接
  12. ps把图片无损放大的方法
  13. stm32wb55 flash
  14. Node + 讯飞语音 定时播放天气预报音频
  15. 【送谷歌定制礼品】一起寻找最初的写作热忱 即刻动笔!
  16. Win7停服,UOS如何应对?
  17. 研究QQ、Fetion、Msn的socket连接
  18. Python实现英文文本的霍夫曼编码压缩
  19. 一次神奇的 sql 查询经历,group by 慢查询优化记录
  20. 白色简洁网站html模板,白色简洁形式pc+wap个人作品集网页模板代码

热门文章

  1. java初学者书籍_面向初学者的5本最佳Java核心书籍
  2. Spring Security示例教程
  3. scala 提取器模式匹配_Scala提取器应用,取消应用和模式匹配
  4. (转载)python-hwdata
  5. java 之 观察者模式(大话设计模式)
  6. SylixOS下移植glib时clock_gettime函数分析
  7. webapi 参数的请求和接收
  8. 【Spring框架】mvc:default-servlet-handler/的作用
  9. jquery中的全局事件
  10. C89 和 C99的标准比较