在同一个线程中多次锁定互斥锁

Meg*_*can 10 c linux posix uclinux embedded-linux

我正在开发嵌入式Linux操作系统(uClinux)上的应用程序,我需要能够多次锁定互斥锁(通过相同的线程).

我有一个mutex和一个mutexattr定义和初始化如下:

pthread_mutexattr_t waiting_barcode_mutexattr;
pthread_mutex_t waiting_barcode_mutex;

pthread_mutexattr_init(&waiting_barcode_mutexattr);
pthread_mutexattr_settype(&waiting_barcode_mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&waiting_barcode_mutex, &waiting_barcode_mutexattr);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试获取锁定两次时它会阻塞第二个锁:

pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);
Run Code Online (Sandbox Code Playgroud)

我错误地初始化它还是有更好的方法来实现它?

提前致谢.

结论:

  • 显然PTHREAD_MUTEX_RECURSIVE或PTHREAD_MUTEX_RECURSIVE_NP不起作用,因此我无法创建可重入的互斥锁.
  • try_lock也不好.如果可以,它获取锁定,如果无法获取锁定则返回错误.不幸的是,错误只是告诉我互斥锁已经在使用中,我不知道当前线程是否已经拥有锁.
  • 如果当前线程有锁,pthread_mutex_lock可以返回错误,但为此我需要创建一个PTHREAD_MUTEX_ERRORCHECK类型的互斥锁,我也不能创建一个.

Jef*_*f B 10

这不是你想要的吗?

第一个调用获取锁定,第二个调用将阻塞,直到第一个锁定被释放(pthread_mutex_unlock).锁是这样做的.

从文档:

"如果互斥锁已被锁定,则调用线程将阻塞,直到互斥锁变为可用."

也许你想要pthread_mutex_trylock?除非我们知道你想要完成什么,否则很难说.

更正:

我没有看到你正在设置PTHREAD_MUTEX_RECURSIVE ....让我再考虑一下.

思考后:

从围绕谷歌代码搜索,看起来PTHREAD_MUTEX_RECURSIVE似乎并未在所有库中实现.您可以尝试PTHREAD_MUTEX_RECURSIVE_NP,或者您可能已经做了一些想要解决这个问题的事情.


Meg*_*can 2

(刚刚意识到我没有将此问题标记为已回答)

\n\n

摘自问题中的结论:

\n\n
    \n
  • 显然 PTHREAD_MUTEX_RECURSIVE 或 PTHREAD_MUTEX_RECURSIVE_NP 不起作用,所以我无法创建可重入互斥体。
  • \n
  • try_lock 也不好。如果可以的话它会获取锁,如果无法获取锁则返回错误。不幸的是,该错误只是告诉我互斥体已在使用中,我无法\xc2\xb4t 找出当前线程是否已拥有锁。
  • \n
  • 如果当前线程拥有锁,pthread_mutex_lock 可能会返回错误,但为此我需要创建一个 PTHREAD_MUTEX_ERRORCHECK 类型的互斥锁,但我也无法创建一个。
  • \n
\n