6-4複数のスレッド、データ共有の問題分析、ケース・コードの作成

15660 ワード

1:複数のスレッドの作成と待機
a、複数のスレッドの実行順序が乱れており、オペレーティングシステム内部のスレッドの実行スケジューリングメカニズムと関係がある.b、メインスレッドはすべてのサブスレッドの実行が終わるのを待って、最後にメインスレッドが終わるのを待って、このようなjoinの書き方を推薦して、もっと安定したプログラムを書きやすいです;c、threadオブジェクトをコンテナに入れて管理し、threadオブジェクトの配列のように見えます.これは私たちが一度に大量のスレッドを作成し、大量のスレッドを管理するのに便利です.
//      
void myprint(int inum)
{
	cout<<"myprint       ,    ="<<inum<<endl;
	//     
	cout<<"myprint       ,    ="<<endl;
	return;
}
int main()
{
	vector<thread> mythreads;
	//  10   ,  
	for(int i = 0;i < 10;i++)
	{
		mythreads.push_back(thread(myprint,i));//  10   ,   10         
	}
	for(auto iter=mythreads.begin();iter!=mythreads.end();++iter)
	{
		iter->join();//  10      
	}
	cout<<"I Love China!"<<endl;//      ,      
	return 0;
}

二:データ共有分析
2.1、読み取り専用のデータ:最も安全で安定していて、特別な処理手段を必要としない.直接読めばいいです.2.2、読み書きがある:2つのスレッドが書いて、8つのスレッドが読んで、コードに特別な処理がなければ、プログラムは必ず崩壊する.最も簡単な崩れない処理は、読むときは書けないし、書くときは読めない.2つのスレッドは同時に書くことができず、8つのスレッドは同時に読むことができない.書く動作は10ステップに分かれています.任務の切り替えのため、各種の奇妙な事が発生した(最も可能性のある奇妙な事はやはり崩壊する);2.3、その他のケースのデータは北京-深セン汽車T 123を共有して、10の切符の窓口は切符を売って、1、2の窓口は同時に98席を予約します
vector <int> g_v = {1,2,3};
void myprint(int inum)
{
	cout<<"id "<<std::this_thread::get_id()<<"     g_v "<<g_v[0]<<g_v[1]<<g_v[2]<<endl;
}
int main()
{
vector<thread> mythreads;
	//  10   ,  
	for(int i = 0;i < 10;i++)
	{
		mythreads.push_back(thread(myprint,i));//  10   ,   10         
	}
	for(auto iter=mythreads.begin();iter!=mythreads.end();++iter)
	{
		iter->join();//  10      
	}
	cout<<"I Love China!"<<endl;//      ,      
	return 0;
}

三:共有データの保護ケースコード
ネットゲームサーバー.2つの自分で作成したスレッド、1つのスレッドはプレイヤーのコマンドを収集し、コマンドデータを1つのキューに書きます.別のスレッドはキューからプレイヤーから送信されたコマンドを取り出し、解析してプレイヤーに必要な動作を実行する.
vector,list,listとvector.List:頻繁に順番にデータを挿入・削除する場合に効率的です.vectorコンテナのランダムな挿入と削除はデータ効率が高い.メンバー関数をスレッド関数として使用する方法でスレッドを書く準備をします.コード化された問題解決:マルチスレッド保護共有データ問題を解決するためのC++の最初の概念「反発量」を導入します.
class A
{
public:
	//      (    )         
	void inMsgRecvQueue()
	{
		for(int i = 0;i<100000;++i)
		{
			cout<<"inMsgRecvQueue()  ,      "<<i<<endl;
			msgRecvQueue.push_back(i);//      i        ,            ;
		}
	}
	//              
	void outMsgRecvQueue()
	{
		for(int i = 0;i<10000;i++)
		{
			if(!msgRecvQueue.empty())
			{
				//     
				int command = msgRecvQueue.front();//       ,          ;
				msgRecvQueue.pop_front();	//       ,    ;
				//         ....
				//....
			}
			else
			{
				//      
				cout<<"      "<<i<<endl;
			}
		}
		cout<<"end"<<endl;
	}
private:
std::list<int> msgRecvQueue;//  ,                  。
};

int main()
{
	A myobja;
	std::thread myOutnMsgObj(&A::outMsgRecvQueue, &myobja);//                    
	std::thread myInMsgObj(&A::inMsgRecvQueue, &myobja);//
	myOutnMsgObj.join();
	myInMsgObj.join();
}