1、创建和等待多个线程
#include <thread>
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;
void myprint(const int & i) {
cout << "hello myprint in mythread start i is: " << i << endl;
// some code run
Sleep(1);
cout << "hello myprint in mythread finish i is: " << i<<endl;
}
void main() {
vector<thread> threads;
for (int i = 0; i < 10; ++i) {
threads.push_back(thread(myprint, i));
}
for (auto iter = threads.begin(); iter != threads.end(); ++iter) {
iter->join();
}
cout << "main thread finished!" << endl;
}
2、数据共享分析
只读的数据没有问题
有读有些的时候,如果有2个线程写8个线程读,如果代码没有特别的处理,程序容易崩溃。
解决方案:
读的时候不能写,写的时候不能读,2个线程不能同时写,8个线程也不能同时读。
问题代码(代码时错误的):
#include <thread>
#include <iostream>
#include <vector>
#include <list>
#include <Windows.h>
using namespace std;
class RecvQueue {
public:
void inMsgRecvQueue() {
for (int i = 0; i < 100000; ++i) {
cout << "inMsgRecvQueue()执行, 插入一个元素: " << i << endl;
msgRecvQueue.push_back(i);
}
}
void outMsgRecvQueue() {
for (int i = 0; i < 100000; ++i) {
if (!msgRecvQueue.empty()) {
int commond = msgRecvQueue.front();
msgRecvQueue.pop_front();
}
else {
cout << "outMsgRecvQueue is empty;" << endl;
}
}
}
private:
std::list<int> msgRecvQueue;
};
void main() {
RecvQueue myobj;
thread myoutqueue(&RecvQueue::outMsgRecvQueue, &myobj);
thread myinqueue(&RecvQueue::inMsgRecvQueue, &myobj);
myoutqueue.join();
myinqueue.join();
}