簡體   English   中英

互斥鎖已經被我鎖定了嗎?

[英]Is mutex locked by me already?

函數正在處理必須通過互斥鎖防止並發線程的變量。
此函數的調用者鎖定互斥鎖,執行其他操作並調用此函數。

現在出現了需要從另一段代碼調用此函數的情況。
當然,這段代碼也可以鎖定互斥鎖,但我想也許該函數可以查看它是否必須鎖定互斥鎖。

我需要的是一個函數,它告訴我當前線程是否已鎖定互斥鎖。 然后該功能可以在不鎖定的情況下繼續進行。 不然會鎖。

int need_to_lock = !my_thread_has_locked_the_mutex(&mutex);

if (need_to_lock)
    mutex_lock(&mutex);

access variables;

if (need_to_lock)
    mutex_unlock(&mutex);

my_thread_has_locked_the_mutex 是否存在? 我找不到任何東西。

編輯評論

我不知道遞歸互斥鎖。 他們似乎按照我的想法行事。
我現在使用的是一個非遞歸互斥鎖,如果從同一個線程鎖定兩次,它就會阻塞。

為什么不直接使用遞歸互斥鎖呢? 遞歸互斥鎖與常規互斥鎖基本相似,但可以被單個線程多次鎖定(即遞歸)。

在某些庫中,互斥鎖默認是遞歸的。 使用 C pthreads,您需要通過適當地初始化互斥鎖來選擇遞歸互斥鎖:

pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(mutex, &attr);

另一種方法是將您的函數分成兩種變體:一種應在持有互斥鎖的情況下調用,另一種應在不持有互斥鎖的情況下調用。 通常的命名約定是將_locked附加到前者,或者將_unlocked附加到后者。 解鎖函數只是簡單地鎖定互斥鎖,然后調用鎖定函數,因此這里不會有任何真正的代碼重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM