gpt4 book ai didi

c - 如果 C 中的线程试图获取它已经拥有的锁,会发生什么情况?

转载 作者:太空宇宙 更新时间:2023-11-04 00:35:00 24 4
gpt4 key购买 nike

所以假设有 1 个线程,线程通过以下方式获取锁:

pthread_mutex_lock(&lock);

然后在解锁之前,它再次到达一行:

pthread_mutex_lock(&lock);

pthread库会阻塞线程的推进,还是会识别线程已经持有锁,从而放过?

最佳答案

行为取决于互斥量的种类。 POSIX standard表示递归锁定行为取决于锁的类型

If a thread attempts to relock a mutex that it has already locked, pthread_mutex_lock() shall behave as described in the Relock column of the following table.

Relock 专栏说的是

  • PTHREAD_MUTEX_NORMAL 类型的互斥锁可能会死锁
  • PTHREAD_MUTEX_ERRORCHECK 类型的互斥量应返回错误
  • PTHREAD_MUTEX_RECURSIVE 类型的互斥体将用作递归锁,您必须在锁定它之后解锁多次
  • PTHREAD_MUTEX_DEFAULT 类型的互斥量将具有未定义的行为,这实际上意味着如果在该平台上默认锁是前三种类型中的任何一种,它将表现特征如上列所示,如果是其他类型,则行为将是未定义的。

因此,测试 PTHREAD_MUTEX_DEFAULT 锁以找出行为是什么尤其没有意义。

还有 Linux manuals pthread_mutex_lock(3)改写如下:

If the mutex is already locked by the calling thread,the behavior of pthread_mutex_lock depends on thekind of the mutex. If the mutex is of the fastkind, the calling thread is suspended until the mutexis unlocked, thus effectively causing the callingthread to deadlock. If the mutex is of the errorchecking kind, pthread_mutex_lock returns immediately with the error code EDEADLK. If the mutex isof the recursive kind, pthread_mutex_lock succeeds and returns immediately, recording the numberof times the calling thread has locked the mutex. Anequal number of pthread_mutex_unlock operations mustbe performed before the mutex returns to the unlockedstate.

根据文档,在 Linux 中,默认类型是快速,但您不能依赖它来移植。

关于c - 如果 C 中的线程试图获取它已经拥有的锁,会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47246443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com