【发布时间】:2010-05-12 17:34:17
【问题描述】:
我正在嵌入式 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);
但是当我尝试两次获取锁时,它会阻塞第二个锁:
pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);
是我初始化错误还是有更好的方法来完成?
提前致谢。
结论:
- 显然 PTHREAD_MUTEX_RECURSIVE 或 PTHREAD_MUTEX_RECURSIVE_NP 不起作用,因此我无法创建可重入互斥体。
- try_lock 也不好。如果可以,它会获取锁,如果无法获取锁,则返回错误。不幸的是,错误只是告诉我互斥锁已在使用中,我无法确定当前线程是否已经拥有锁。
- 如果当前线程有锁,pthread_mutex_lock 会返回错误,但为此我需要创建一个 PTHREAD_MUTEX_ERRORCHECK 类型的互斥锁,我也无法创建。
【问题讨论】:
-
你为什么要多次锁定它?通常使用互斥锁,以便在任何给定时间只有一部分代码可以拥有锁。
-
基本上它与我设置代码和辅助功能的方式有关。也许我应该更改我的代码并避免这种情况。无论如何,我很好奇。
-
您是否正在检查属性和互斥初始化调用的返回值?可能是你的 libc 不支持递归锁?
-
@Nikolai:我忘了测试返回值,但我现在测试了它们,它们都返回 0。@Brian:不,我不想使用信号量。
标签: c linux posix embedded-linux uclinux