繁体   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