簡単なコード(私はそれが非常に悪いものであることを知っているが、私はちょうど例のためにそれを作った):マルチスレッド。共通のリソースを等しく共有する方法
1 #include <mutex>
2 #include <iostream>
3 #include <thread>
4
5 std::mutex mu;
6
7 void myFunc(void) {
8 for (int i = 0; i < 100; ++i) {
9 mu.lock();
10 std::cout << "CHILD Thread: " << std::this_thread::get_id() << std::endl;
11 mu.unlock();
12 }
13 }
14
15 int main()
16 {
17 std::thread thr(myFunc);
18 for (int i = 0; i < 100; ++i) {
19 mu.lock();
20 std::cout << "MAIN Thread: " << std::this_thread::get_id() << std::endl;
21 mu.unlock();
22 }
23 thr.join();
24 return 0;
25 }
リターン出力のこの種:
1 MAIN Thread: 140581832210240
2 MAIN Thread: 140581832210240
3 MAIN Thread: 140581832210240
4 MAIN Thread: 140581832210240
5 MAIN Thread: 140581832210240
6 MAIN Thread: 140581832210240
7 MAIN Thread: 140581832210240
8 CHILD Thread: 140581814855424
9 CHILD Thread: 140581814855424
10 CHILD Thread: 140581814855424
11 CHILD Thread: 140581814855424
12 CHILD Thread: 140581814855424
13 CHILD Thread: 140581814855424
14 CHILD Thread: 140581814855424
15 CHILD Thread: 140581814855424
16 CHILD Thread: 140581814855424
17 CHILD Thread: 140581814855424
18 MAIN Thread: 140581832210240
19 MAIN Thread: 140581832210240
20 MAIN Thread: 140581832210240
21 MAIN Thread: 140581832210240
22 MAIN Thread: 140581832210240
23 CHILD Thread: 140581814855424
24 CHILD Thread: 140581814855424
25 CHILD Thread: 140581814855424
26 CHILD Thread: 140581814855424
27 CHILD Thread: 140581814855424
28 CHILD Thread: 140581814855424
29 CHILD Thread: 140581814855424
....... and so on
と私はそれを見るように - この出力は、あるスレッドが他のスレッドを長時間待たなければならないため、マルチスレッドの意味を打ち消します。この出力は、同時に私に子供の叫び声、メインの叫び声、子供の叫び声、メインの叫び声などを与えるはずです。私はミューテックスが共通の資源の公平な分担に責任を負わないことを知っていますが、誰ですか?そして私はそれを私のプログラムにどのように実装しますか?
ありがとうございます。
EDIT:パッティングのstd :: coutの機能へ:
10 void common_cout(string msg) {
11 mu.lock();
12 std::cout << msg << std::endl;
13 mu.unlock();
14 }
doesntのヘルプ。
あなたはすべてのスレッドで同じメモリ空間を使用しないでください。このため、ロックなどを使用する必要があります。最初のスレッドがメモリの1/number_of_threadsを使用するように、スペースを等分します。その場合は、ロック機構を使用する必要はありません。 CPU上で実行できるスレッド数も確認してください。 CPUがサポートするスレッドよりも多くのスレッドを実行するのは理にかなっていません。 – nosbor