C++并行开发4-创建多个线程,数据共享问题分析
1.创建多个线程
#include <iostream>
#include <thread>
#include <algorithm>
#include <vector>
using namespace std;
void myprint(int i) {
cout << "第 " << i << "个线程开始运行" << endl;
cout << "第 " << i << "个线程运行结束" << endl;
}
int main()
{
vector<thread> mythreads;
for (int i = 0; i < 10; i++) {
mythreads.push_back(thread(myprint, i));
}
for (auto iter = mythreads.begin(); iter != mythreads.end(); ++iter) {
iter->detach();
}
cout << "主线程运行结束" << endl;
return 0;
}
2 数据共享问题
2.1 只读数据
#include <iostream>
#include <thread>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> g_v = { 1, 2, 3 }; //这种创建方法是C++11新特性
void myprint(int i) {
cout << "第 " << i << "个线程开始运行" << endl;
cout << "线程ID为" << std::this_thread::get_id() << "打印" << g_v[0] << g_v[1] << g_v[2] << endl;
cout << "第 " << i << "个线程运行结束" << endl;
}
int main()
{
vector<thread> mythreads;
for (int i = 0; i < 10; i++) {
mythreads.push_back(thread(myprint, i));
}
for (auto iter = mythreads.begin(); iter != mythreads.end(); ++iter) {
iter->join();
}
cout << "主线程运行结束" << endl;
return 0;
}
只读数据是安全的
2.2 有读有写的数据
若不加处理,就会出错
最简单的防止崩溃方法:读的时候不能写,写的时候不能读。
写的动作分10小步,由于任务切换,导致各种诡异的事情发生(最可能的还是崩溃)
#include
#include
#include
#include
#include
using namespace std;//调用类对象的成员函数的方式来创建线程
class A {
public:
void inMsgRecvQueue()
{
for (int i = 0; i < 10000; i++) {
cout << “消息队列插入一个元素 “ << i << endl;
msgRecvQueue.push_back(i);
}
}
void outMsgRecgQueue() {
for (int i = 0; i < 10000; i++) {
if (!msgRecvQueue.empty()) {
//消息队列非空
int command = msgRecvQueue.front(); //取出第一个元素
msgRecvQueue.pop_front();
}
else {
//消息队列为空
cout << “outMsgRecgQueue执行,目前消息队列为空” << endl;
}
}
}
private:
listmsgRecvQueue; //消息队列
};int main()
{
A myobja;
std::thread myOutnMsgObj(&A::outMsgRecgQueue, &myobja);
std::thread myInnMsgObj(&A::inMsgRecvQueue, &myobja);
//这里必须使用引用,否则线程会重新拷贝构造一个对象,
//但是使用引用就需要考虑类对象的使用周期,必须在主线程使用结束
myOutnMsgObj.join();
myInnMsgObj.join();
return 0;
}
- Title: C++并行开发4-创建多个线程,数据共享问题分析
- Author: FengLY
- Created at : 2023-06-18 22:40:09
- Updated at : 2023-06-18 22:55:54
- Link: https://zhouaq.com/2023/06/18/C++并行开发4-创建多个线程,数据共享问题分析/
- License: This work is licensed under CC BY-NC-SA 4.0.