- 论坛徽章:
- 2
|
本帖最后由 danger007 于 2016-04-21 10:06 编辑
互斥量的属性到底该怎么用啊,按《Unix环境高级编程》上说的,持有互斥量的线程死亡后自动释放互斥量(设置了ROBUST属性的前提下),其他线程在lock时会返回EOWNERDEAD,然后调用pthread_mutex_consistent后互斥量可正常使用,可代码显示会阻塞(和设置STALLED时无差别);代码和结果如下(运行平台是Ubuntu14.04):
#include"all.h"
#include<errno.h>
pthread_mutex_t mutex;
int count;
void thread1(void *arg)
{
printf("this is the first thread holding lock and die!\n");
pthread_mutex_lock(&mutex);
count++;
pthread_exit(NULL);
}
void thread2(void *arg)
{
int err;
printf("this is the second thread while lock owner died!\n");
err=pthread_mutex_lock(&mutex);
if(err==EOWNERDEAD)
{
printf("mutex is still locked!\n");
pthread_mutex_consistent(&mutex);
}
printf("mutex state has been restored!\n");
count++;
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(void)
{
pthread_mutexattr_t attr;
pthread_attr_t pthrattr;
pthread_t tid1,tid2;
int err;
pthread_attr_init(&pthrattr);
pthread_attr_setdetachstate(&pthrattr,PTHREAD_CREATE_JOINABLE);
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr,PTHREAD_PROCESS_PRIVATE);
pthread_mutexattr_setrobust(&attr,PTHREAD_MUTEX_ROBUST);
err=pthread_create(&tid1,&pthrattr,(void *)thread1,NULL);
if(err!=0)
{
printf("create thread failed!\n");
exit(-1);
}
sleep(1);
err=pthread_create(&tid2,&pthrattr,(void *)thread2,NULL);
if(err!=0)
{
printf("create thread failed!\n");
exit(-1);
}
sleep(1);
printf("%d\n",count);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
exit(0);
}
结果如下:file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\1044152637\QQ\WinTemp\RichOle\SINZBM_}_J88QUNJA`(~LAA.png
|
|