不合理的設定臨界區域,會讓線程的調用失去意義。
代碼一:
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; void workFun(int index) { for (int i = 0; i < 100; i++) { m_lock.lock(); //臨界區域-開始 cout << index << " child thread " << i << endl; //臨界區域-結束 m_lock.unlock(); } }//搶佔式 int main() { thread t[3]; for (int n = 0; n<3; n++) { t[n] = thread(workFun, n); } for (int n = 0; n<3; n++) { t[n].join(); } for (int i = 0; i<4; i++) cout << "i am main thread " << i << endl; return 0; }
代碼二:
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; void workFun(int index) { m_lock.lock(); //臨界區域-開始 for (int i = 0; i < 100; i++) { cout << index << " child thread " << i << endl; } //臨界區域-結束 m_lock.unlock(); }//搶佔式 int main() { thread t[3]; for (int n = 0; n<3; n++) { t[n] = thread(workFun, n); } for (int n = 0; n<3; n++) { t[n].join(); } for (int i = 0; i<4; i++) cout << "i am main thread " << i << endl; return 0; }
代碼二,會讓 t[0] t[1] t[2] 這三個線程不再並行,而是順序執行。這樣就失去了調用線程的意義。