簡單的代碼(我知道,這是一個非常糟糕的一個,但我做到了只是爲例子):多線程。如何平等地分享公共資源?
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
,當我看到它 - 這個輸出失敗了多線程的含義,因爲一個線程需要等待很長一段時間。這個輸出應該同時給我兒童,主要的cout,兒童的cout,主要的cout等等。我知道互斥對於共享資源的公平分享不負責任,但是:誰是?我如何將其實施到我的程序中?
謝謝。
編輯:把性病::法院成一個函數:
10 void common_cout(string msg) {
11 mu.lock();
12 std::cout << msg << std::endl;
13 mu.unlock();
14 }
犯規幫助。
你不應該被所有線程使用相同的內存空間。這就是爲什麼你必須使用鎖等。第一個線程將使用1/number_of_threads內存塊來平均分配空間。在這種情況下,你甚至不需要使用鎖定機制。 還要檢查CPU上可以運行多少個線程。運行比CPU支持更多的線程是沒有意義的。 – nosbor