C++多线程Demo
《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相关推荐
- Python简单的多线程demo:装逼写法
Python简单的多线程demo:装逼写法 用面向对象来写多线程: import threadingclass MyThread(threading.Thread):def __init__(self ...
- java线程 demo_Java多线程demo
近期考虑采用Java多线程实现给用户发短信的功能.自己做了一个简单的demo. demo需求如下:通过界面输入用户名.密码.手机号,点击添加,即可实时的为该用户发一条短信. 实现过程如下: 2.点击& ...
- 程序模拟电影院窗口卖票,多线程Demo
某电影院目前正在上映国产大片,共有100张票,而它有3个窗口卖票,请设计一个程序模拟该电影院卖票 卖电影票Demo 实现步骤 1.SellTicket类 2.SellTicketDemo测试类 3.测 ...
- 有返回值的多线程demo
package com.jimmy.demo.util; import java.util.HashMap;import java.util.concurrent.*;import java.util ...
- vs c语言 多线程demo,一个多线程的Socket通信Demo(C语言实现)
-----------这是客户端程序-------------- #include "stdio.h" #include "winsock2.h" #inclu ...
- Java多线程Demo
三个Java多线程循环打印递增的数字,每个线程打印5个数值,打印周期1-75 1)打印数值线程类 package com.volitation.bigdata.holder.thread;import ...
- Java的Socket通信----通过 Socket 实现 TCP 编程之多线程demo(2)
JAVA Socket简介 所谓socket 通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答 ...
- QMainWindow多线程demo
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets, QtCore import sys from PyQt5.QtCore import * im ...
- iOS 多线程的四种技术方案
iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...
最新文章
- 认识计算机系统反思,《认识计算机系统》教学反思
- HDU 1231 最大连续子序列:水dp
- Map.putAll方法——追加另一个Map对象到当前Map集合
- java8之list集合中取出某一属性的方法
- cgi java编程_Java的CGI数据编码改如何编写
- NLP(三) 预处理
- 深度学习(三):初级卷积神经网络
- 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
- onCreateView中加载大位图
- 分享一款思维导图工具-幕布(附在线工具合集、Android进阶知识体系)
- QT相关内容的下载链接
- ps把图片无损放大的方法
- stm32wb55 flash
- Node + 讯飞语音 定时播放天气预报音频
- 【送谷歌定制礼品】一起寻找最初的写作热忱 即刻动笔!
- Win7停服,UOS如何应对?
- 研究QQ、Fetion、Msn的socket连接
- Python实现英文文本的霍夫曼编码压缩
- 一次神奇的 sql 查询经历,group by 慢查询优化记录
- 白色简洁网站html模板,白色简洁形式pc+wap个人作品集网页模板代码