代碼結構比較複雜的情況下,手動加鎖,解鎖,可能會有所遺漏。
這種情況下,推薦使用自解鎖(自解鎖在構造的時候lock,在析構的時候unlock)(對象在超出作用域時會執行析構)
自解鎖,手動鎖優缺點:自解鎖每次都會構造,析構。在執行效率上沒有手動鎖效率高。
演示代碼:
示例一:手動加鎖,解鎖(要在每個代碼分支的地方保證解鎖)
#include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; void workFun(int index) { for (int i = 0; i < 1000; i++) { m_lock.lock(); if (i > 500) { m_lock.unlock(); return; } 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) { for (int i = 0; i < 1000; i++) { lock_guard<mutex> gl(m_lock); //m_lock.lock(); if (i > 500) { //m_lock.unlock(); return; } 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; }