一、lock.trylock帶參數
lock.trylock方法是用來獲取鎖的,比較常用並且非阻塞。如果鎖已經被其他線程獲取,那麼方法直接返回false。如果鎖沒有被其他線程獲取,那麼方法獲取鎖並且直接返回true。
在C++11中,lock.trylock方法可以傳遞一個std::adopt_lock_t類型的參數,通過這個參數告知方法獲取鎖並且託管給std::unique_lock對象。下面是一個典型的例子:
std::mutex m; std::unique_lock lock(m, std::try_to_lock); if (lock.owns_lock()) { // ... }
在上面的例子中,unique_lock對象會嘗試獲取鎖,如果獲取成功,那麼該對象會託管std::mutex對象並且進行使用。
二、lock.trylock三個參數
在C++11中,lock.trylock方法也可以傳遞三個參數。下面是三個參數的含義:
- lock.trylock(m):嘗試獲取鎖,如果鎖已經被其他線程獲取,那麼方法直接返回false。
- lock.trylock(m, std::defer_lock):創建unique_lock對象但不獲取鎖。
- lock.trylock(m, std::try_to_lock):嘗試獲取鎖,如果鎖已經被其他線程獲取,那麼方法直接返回false。
在以上三個參數中,std::defer_lock是最常用的。下面是一個典型的例子:
std::mutex m; std::unique_lock lock(m, std::defer_lock); if (lock.try_lock()) { // ... }
在上面的例子中,unique_lock對象不會嘗試獲取鎖。當unique_lock對象調用try_lock方法時,對象會嘗試獲取鎖。
三、lock.trylock後再lock會報錯嗎
在C++11和C++17中,lock.trylock獲取鎖後,如果鎖已經被其他線程獲取,那麼方法會直接返回false而不是阻塞調用線程。因此,在獲取鎖前沒有任何問題。
每個線程在獲取鎖後,需要在規定的時候釋放鎖。在釋放鎖前,不能再次鎖定相同的鎖。下面是一個例子:
std::mutex m; std::unique_lock lock(m); if (lock.try_lock()) { // ... lock.unlock(); } lock.lock(); //會報錯
在上面的例子中,unique_lock對象首先嘗試獲取鎖並且成功,然後執行一些代碼,最後釋放鎖。但是在釋放鎖後,該線程又再次嘗試獲取相同的鎖。這時候會產生死鎖。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/270453.html