【发布时间】:2020-02-27 12:59:09
【问题描述】:
一个函数正在对必须通过互斥锁防止并发线程的变量执行操作。
此函数的调用者锁定一个互斥体,执行其他操作并调用此函数。
现在出现了需要从另一段代码调用此函数的情况。
当然,这段代码也可以锁定互斥锁,但我想也许该函数可以查看它是否必须锁定互斥锁。
我需要一个函数来告诉我当前线程是否锁定了互斥锁。然后该功能可以在没有锁定的情况下继续。否则它会锁定。
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 是否存在?我找不到任何东西。
编辑到 cmets
我不知道递归互斥锁。他们似乎按照我的想法行事。
我现在使用的是一个非递归互斥锁,如果从同一个线程锁定两次,就会阻塞。
【问题讨论】:
-
你可以使用recursive mutex
-
如果你在同一个线程中,再次锁定没有害处(参见:“递归互斥锁”)。如果另一个线程已锁定,那么您的线程将等待锁定,这正是互斥锁的要点。您提出的检查-然后-执行的情况是一种竞争条件,因为另一个线程可能会在检查和操作之间锁定/解锁。
-
... 这个通用的习惯用法很常见:不是在对跨线程依赖做某事之前进行检查,而是简单地尝试(使用支持这一点的 API)并在 之后进行检查 i> 是否有效。当然,细节会有所不同,包括尝试是否会阻塞,但一般模式基本上适用于所有同步操作和许多原子操作。实际上,即使对于单线程代码,这也是一个标准的习惯用法:看看有多少函数的返回值传达了包括函数是成功还是失败的信息。
-
“因为另一个线程可以在检查和操作之间锁定/解锁” - 是的,另一个线程可以在此时锁定,但这不会造成伤害,因为我的函数会按照互斥锁的预期等待。唯一的一点是,如果我的线程已经有了互斥锁,那么我就不必再次锁定它了。