1. 程式人生 > >建立多個執行緒、資料共享問題分析

建立多個執行緒、資料共享問題分析

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;
}

程式會崩潰。