建立多個執行緒、資料共享問題分析
阿新 • • 發佈:2018-12-21
Join
多個執行緒執行順序是亂的,跟作業系統內部對執行緒的排程機制有關。
主執行緒等待子執行緒執行完畢後才執行
void myprint(int item) { cout << "執行緒編號" << item << endl; } int main() { //建立執行緒 vector<thread> mythread; for (int i = 0; i < 10; i++) { mythread.push_back(thread(myprint, i)); } for (auto iter = mythread.begin(); iter != mythread.end(); ++iter) { iter->join(); } cout << "hello world" << endl; return 0; }
資料共享問題分析
1.只讀資料:安全穩定
2.有讀有寫:如果讀和寫一起執行,程式會崩潰。
不崩潰處理:最簡單的方法就是讀和寫分開。
但是如果任務一直切換的,可能會有詭異的事情發生(甚至可能崩潰)
共享資料的保護案例程式碼:
網路遊戲伺服器。兩個自己建立的執行緒,一個執行緒收集玩家的命令(用一個數字代表玩家的命令)。一個執行緒取出玩家的命令,並且執行玩家要乾的動作。
class A { std::list<int>msgReceive; public: void inMsgRecQueue() { for (int i = 0; i < 100; ++i) { cout << "inMsgRecQueue()執行,插入一個元素" << i << endl; msgReceive.push_back(i); } } void outMsgRecQuene() { for (int i = 0; i < 100; ++i) { cout << "inMsgRecQueue()執行,取出一個元素" << i << endl; if (msgReceive.empty()) { //訊息不為空 int comeon = msgReceive.front(); msgReceive.pop_front(); //...其他處理 } else { //訊息為空 cout << "outMsgRecQuene執行,但是訊息佇列為空!" << endl; } } } }; int main() { A a; std::thread myOutMsg(&A::outMsgRecQuene, &a); std::thread myRecMsg(&A::inMsgRecQueue, &a); myOutMsg.join(); myRecMsg.join(); cout << "hello world" << endl; return 0; }
程式會崩潰。