一个持有互斥体的线程死亡。 另一个线程在调用“pthread_mutex_lock”时会死锁,尽pipe我使用了“PTHREAD_MUTEX_ERRORCHECK”属性。
#include <pthread.h> #include <iostream> #include <unistd.h> using namespace std; pthread_mutex_t mutex; void *handler(void *) { cout << "child thread" << endl; int ret = pthread_mutex_lock(&mutex); cout << "child ret: " << ret << endl; pthread_exit(NULL); } int main() { pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr,PTHREAD_MUTEX_ERRORCHECK); pthread_mutex_init(&mutex,&attr); pthread_mutexattr_destroy(&attr); pthread_t tid; pthread_create(&tid,NULL,handler,NULL); sleep(2); cout << "father awake" << endl; int ret = pthread_mutex_lock(&mutex); cout << "father ret: " << ret << endl; return 0; }
输出:
[LINUX环境]: Linux的ubuntu 3.19.0-25-generic#26〜14.04.1-Ubuntu的SMP
与FIFO等待队列的Linux同步
使用互斥锁时出错
尝试打开互斥锁时出现UnauthorizedAccessException
线程等待父
我们是否确实需要与“PTHREAD_MUTEX_ROBUST”相反的属性“PTHREAD_MUTEX_STALLED”的互斥锁?
Boost :: mutex比没有mutex的程序花费的时间less
Linux中使用条件variables的Windows事件实现?
什么意思futex_?
读取信号处理程序中的共享数据
CreateMutex和OpenMutex返回NULL
您可能正在考虑互斥锁的可靠属性 ( pthread_mutexattr_setrobust() ),而不是错误检查类型的互斥锁。 一个强大的互斥体会通知你的主线程,互斥锁的持有者已经终止了EOWNERDEAD。
另一方面,PTHREAD_MUTEX_ERRORCHECK类型只是简单地防范三种错误 :
试图递归锁定自己锁定的互斥锁(这里不适用)
试图解锁另一个线程锁定的互斥锁(这里不适用)
试图解锁一个解锁的互斥体(这里不适用)
这是一个使用pthread_mutexattr_setrobust调用的小例子,它允许将从未解锁的mutex设置回一致的状态:
#include <stdio.h> #include <unistd.h> #include <pthread.h> pthread_mutex_t lock; void dropped_thread(void) { printf("Setting lock...n"); pthread_mutex_lock(&lock); printf("Lock set,Now exiting without unlocking...n"); pthread_exit(NULL); } int main(int argc,char *argv[]) { pthread_t lock_getter; pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setrobust(&attr,PTHREAD_MUTEX_ROBUST); pthread_mutex_init(&lock,&attr); pthread_mutexattr_destroy(&attr); pthread_create(&lock_getter,(void *) dropped_thread,NULL); sleep(2); printf("Inside mainn"); printf("Attempting to acquire unlocked mutex?n"); pthread_mutex_consistent(&lock); pthread_mutex_unlock(&lock); pthread_mutex_lock(&lock); printf("Successfully acquired lock!n"); pthread_mutex_destroy(&lock); return 0; }
正如您在设置mutex健壮性之后通过调用pthread_mutex_consistent看到的,其状态将再次标记为一致。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。