互斥鎖
線上程實際運行過程中,我們經常需要多個執行緒保持同步。這時可以用互斥鎖來完成任務;互斥鎖的使用過程中,主要有pthread_mutex_init,pthread_mutex_destory,pthread_mutex_lock,pthread_mutex_unlock這幾個函式以完成鎖的初始化,鎖的銷毀,上鎖和釋放鎖操作。
下表列出了用來處理互斥鎖的函式。
操作 | 相關函式說明 |
初始化互斥鎖 | pthread_mutex_init語法 |
使互斥鎖保持一致 | pthread_mutex_consistent_np語法 |
鎖定互斥鎖 | pthread_mutex_lock語法 |
解除鎖定互斥鎖 | pthread_mutex_unlock語法 |
使用非阻塞互斥鎖鎖定 | pthread_mutex_trylock語法 |
銷毀互斥鎖 | pthread_mutex_destroy語法 |
預設調度策略 SCHED_OTHER 不指定執行緒可以獲取鎖的順序。如果多個執行緒正在等待一個互斥鎖,則獲取順序是不確定的。出現爭用時,預設行為是按優先權順序解除執行緒的阻塞。
解鎖定互斥鎖
對於 Solaris 執行緒,請參見mutex_unlock語法。
pthread_mutex_unlock語法
int pthread_mutex_unlock(pthread_mutex_t *mutex);
#include <pthread.h>
pthread_mutex_t mutex;
int ret;
ret = pthread_mutex_unlock(μtex); /* release the mutex */
pthread_mutex_unlock()可釋放 mutex引用的互斥鎖對象。互斥鎖的釋放方式取決於互斥鎖的類型屬性。 如果調用 pthread_mutex_unlock()時有多個執行緒被 mutex對象阻塞,則互斥鎖變為可用時調度策略可確定獲取該互斥鎖的執行緒。 對於PTHREAD_MUTEX_RECURSIVE類型的互斥鎖,當計數達到零並且調用執行緒不再對該互斥鎖進行任何鎖定時,該互斥鎖將變為可用。
pthread_mutex_unlock返回值
pthread_mutex_unlock()在成功完成之後會返回零。其他任何返回值都表示出現了錯誤。如果出現以下情況,該函式將失敗並返回對應的值。
•EPERM
•當前執行緒不擁有互斥鎖。
代碼示例
下面 顯示了使用互斥鎖定的一些代碼段。
#include <pthread.h>
pthread_mutex_t count_mutex;
long long count;
void
increment_count()
{
pthread_mutex_lock(&count_mutex);
count = count + 1;
pthread_mutex_unlock(&count_mutex);
}
long long
get_count()
{
long long c;
pthread_mutex_lock(&count_mutex);
c = count;
pthread_mutex_unlock(&count_mutex);
return (c);
}
上面兩個函式將互斥鎖用於不同目的。 increment_count()函式使用互斥鎖確保對共享變數進行原子更新。 get_count()函式使用互斥鎖保證以原子方式讀取 64 位數量count。在 32 位體系結構上,longlong實際上是兩個 32 位數量。
讀取整數值時執行的是原子運算,因為整數是大多數計算機中常見的字長