<form id="dlljd"></form>
        <address id="dlljd"><address id="dlljd"><listing id="dlljd"></listing></address></address>

        <em id="dlljd"><form id="dlljd"></form></em>

          <address id="dlljd"></address>
            <noframes id="dlljd">

              聯系我們 - 廣告服務 - 聯系電話:
              您的當前位置: > 關注 > > 正文

              關注:如何使用lock_guard鎖定mutex?java中mutex的使用方法

              來源:CSDN 時間:2023-01-16 07:55:05

              mutex用來協助采取獨占方式控制對資源的并發訪問,這里的資源可能是一個對象,或多個對象的組合,為了獲得獨占式的資源訪問能力,相應的線程必須鎖定mutex,這樣可以防止其它線程也鎖定該mutex。

              下面兩條線程如果沒有使用mutex來同步,則輸出結果會是112233。

              mutex g_mutex;void print123() {g_mutex.lock();for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}g_mutex.unlock();} int main(){thread(print123).detach();thread(print123).detach();//123123system("pause");}

              你應該確保mutex對象調用lock后,即使發生異常也會調用unlock,否則有可能造成資源被永遠鎖住或者死鎖。


              (資料圖片)

              為此我們可以使用lock_guard來進行lock和unlock,lock_guard在構造時會lock,析構時會unlock,使用大括號對可以加快lock_guard的析構,需要注意的是lock_guard一定要分配變量名,否則不會有效果。

              void print123(){lock_guard lockGuard(g_mutex);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}}

              同一線程多次鎖定mutex會導致程序終止,而recursive_mutex則不會,這個mutex允許同一線程多次鎖定。

              recursive_mutex g_mutex;void print123(){g_mutex.lock();g_mutex.lock();for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}g_mutex.unlock();g_mutex.unlock();}

              有時候線程想要鎖定mutex,但又不想其它線程已鎖定mutex時阻塞,這種情況下可以使用try_lock,它試圖鎖定mutex,成功就返回true,失敗返回false。

              為了等待特定長度的時間,你可以使用timed_mutex或recursive_timed_mutex的try_lock_for或try_lock_until方法。

              由于try_lock在返回true時會鎖定mutex,為了防止lock_guard重復鎖定,需要傳遞參數adopt_lock。

              void print123() {if (g_mutex.try_lock()) {lock_guard  lockGuard(g_mutex,adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}} else {cout << "mutex locked" <thread(print123).detach();thread(print123).detach();system("pause");}

              通常一個線程一次只鎖定一個mutex,然而有時候必須鎖定多個mutex,如果一個個鎖定,有可能出現鎖定了第一個mutex,而無法鎖定第二個mutex的情況。這種情況下可以使用全局函數lock鎖定多個mutex。

              mutex g_mutex1;mutex g_mutex2;void print123() {lock(g_mutex1, g_mutex2);lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}} int main(){thread(print123).detach();thread(print123).detach();system("pause");}

              使用全局函數try_lock嘗試鎖定多個mutex,如果鎖定所有mutex則返回-1,否則返回第一個失敗的mutex的索引(從0開始),并且所有被成功lock的mutex會又被unlock。

              mutex g_mutex1;mutex g_mutex2;void print123() {lock(g_mutex1, g_mutex2);lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);for (int i = 0; i < 3; i++) {this_thread::sleep_for(chrono::milliseconds(100));cout << i + 1;}}void printLockState(){auto result = try_lock(g_mutex1, g_mutex2);cout << result << endl;if (result == -1) {lock_guard lockGuard1(g_mutex1, adopt_lock);lock_guard lockGuard2(g_mutex2, adopt_lock);}} int main(){thread(print123).detach();thread(printLockState).detach();system("pause");}

              除了lock_guard,C++還提供一個類似的類unique_lock,它比lock_guard更靈活,unique_lock允許你明確指定何時鎖定或解鎖mutex,而lock_guard總是鎖定mutex,如果unique_lock析構時mutex仍被鎖住,析構函數會自動調用unlock,如果沒有則不做任何事。

              mutex g_mutex1;timed_mutex g_mutex2; int main(){//嘗試鎖定mutex,但不會阻塞unique_lock uniqueLock1(g_mutex1, try_to_lock);//嘗試鎖定mutex,不超過10秒unique_lock uniqueLock2(g_mutex2, chrono::seconds(10));//主動調用lock,try_lock,try_lock_for等才會鎖定unique_lock uniqueLock3(g_mutex1, defer_lock);//通過已鎖定的mutex初始化unique_lock uniqueLock4(g_mutex1, adopt_lock);//判斷有沒有鎖定mutexcout << (uniqueLock1 ? "locked" : "unlocked")<< endl;cout << uniqueLock1.owns_lock() << endl;//解鎖mutexuniqueLock1.unlock();//鎖定mutexuniqueLock3.lock();system("pause");}
              責任編輯:

              標簽:

              相關推薦:

              精彩放送:

              新聞聚焦
              Top 中文字幕在线观看亚洲日韩