1. 程式人生 > 實用技巧 >c++標準庫std::thread測試一(流程控制)

c++標準庫std::thread測試一(流程控制)

1.需求, 現在10個執行緒分別列印AAA... BBB... CCC...要求按順序列印, 如圖所示

Plan1:

 1 #define THREAD_CNT 5
 2 
 3 std::condition_variable g_cvs[THREAD_CNT];
 4 std::condition_variable g_cv;
 5 std::mutex g_mtx;
 6 
 7 int g_curIndex = -1;
 8 
 9 void PrintChar(char ch)
10 {
11     int index = ch - 'A';
12     int sleepMsTime = rand() % 2000
; 13 printf("%c ready\n", ch); 14 std::this_thread::sleep_for(std::chrono::milliseconds(sleepMsTime)); 15 printf("%c lock\n", ch); 16 std::unique_lock<std::mutex> lg(g_mtx); 17 while (1) 18 { 19 g_cv.wait(lg); 20 if (g_curIndex == index) 21 { 22 break
; 23 } 24 } 25 printf("%c unlock\n", ch); 26 printf("\n"); 27 for (int i = 0; i < 10; ++i) 28 { 29 printf("%c", ch); 30 } 31 printf("\n"); 32 ++g_curIndex; 33 g_cv.notify_all(); 34 } 35 36 37 int main() 38 { 39 srand(time(nullptr)); 40 std::vector<std::thread> vecThreads;
41 for (int i = 0; i < THREAD_CNT; ++i) 42 { 43 vecThreads.push_back(std::thread(PrintChar, i + 'A')); 44 } 45 std::this_thread::sleep_for(std::chrono::milliseconds(3000)); 46 g_curIndex = 0; 47 g_cv.notify_all(); 48 for (auto &t : vecThreads) 49 { 50 t.join(); 51 } 52 return 0; 53 }

Plan2:

 1 #define THREAD_CNT 5
 2 
 3 std::condition_variable g_cvs[THREAD_CNT];
 4 std::condition_variable g_cv;
 5 std::mutex g_mtx;
 6 
 7 void PrintChar(char ch)
 8 {
 9     int index = ch - 'A';
10     int sleepMsTime = rand() % 2000;
11     printf("%c ready\n", ch);
12     std::this_thread::sleep_for(std::chrono::milliseconds(sleepMsTime));
13     printf("%c lock\n", ch);
14     std::unique_lock<std::mutex> lg(g_mtx);
15 
16     g_cvs[index].wait(lg);
17 
18     printf("%c unlock\n", ch);
19     printf("\n");
20     for (int i = 0; i < 10; ++i)
21     {
22         printf("%c", ch);
23     }
24     printf("\n");
25     if (index != THREAD_CNT - 1)
26     {
27         g_cvs[index + 1].notify_one();
28     }
29 }
30 
31 
32 int main()
33 {
34     srand(time(nullptr));
35     std::vector<std::thread> vecThreads;
36     for (int i = 0; i < THREAD_CNT; ++i)
37     {
38         vecThreads.push_back(std::thread(PrintChar, i + 'A'));
39     }
40     std::this_thread::sleep_for(std::chrono::milliseconds(3000));
41     g_cvs[0].notify_one();
42     for (auto &t : vecThreads)
43     {
44         t.join();
45     }
46     return 0;
47 }