mutex 是不是已经被我锁定了?
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
附加到后者。 unlocked 函数简单地锁定互斥锁,然后调用 locked 函数,所以这里不会有任何真正的代码重复。
一个函数正在对必须通过互斥锁防止并发线程的变量执行操作。
此函数的调用者锁定互斥量,执行其他操作并调用此函数。
现在出现了需要从另一段代码调用此函数的情况。
当然,这段代码也可以锁定互斥量,但我想也许函数可以查看是否必须锁定互斥量。
我需要的是一个函数,告诉我当前线程是否锁定了互斥量。然后该功能可以在没有锁定的情况下继续。否则会锁定。
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
附加到后者。 unlocked 函数简单地锁定互斥锁,然后调用 locked 函数,所以这里不会有任何真正的代码重复。