不合理的設定臨界區域,會讓線程的調用失去意義。
1.不應該頻繁的使用鎖
2.減小鎖使用的區域,線程公共資源之外 的資源 儘量不要放到臨界區。
-------------------------------------------------------------------------------------------------------
示例一:(這樣使用線程鎖,設定的臨界區域不合理,會讓線程的調用失去意義,線程並沒有併發執行)
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; int sum = 0; void workFun(int index) { m_lock.lock(); for (int i = 0; i < 1000; i++) { sum++; cout << "thread:"<<index << " sum=" << sum<<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(); } cout << "sum=" << sum << endl; cout << "i am main thread " << endl; return 0; }
----------------------------------------------------------------------------------------------------------
示例二:(不用線程)
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; int sum = 0; void workFun() { for (int i = 0; i < 300000; i++) { sum++; } }//搶佔式 int main() { thread t[3]; workFun(); cout << "sum=" << sum << endl; cout << "i am main thread " << endl; return 0; }
示例三:(使用線程,並且加鎖)
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; int sum = 0; void workFun(int index) { for (int i = 0; i < 100000; i++) { m_lock.lock(); sum++; 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(); } cout << "sum=" << sum << endl; cout << "i am main thread " << endl; return 0; }
示例三的耗時 會比 示例二的耗時大,所以要慎用多線程,慎用鎖。設計不好的多線程反而會更耗時。