如何精确地销毁pthread mutex变量?
这是我想做的事情。 我想要缓存对象(结构体变量),这些对象由键查找。 我希望在此处拥有尽可能小的锁颗粒度。因此,我想要每个对象一个锁,可能嵌入在结构中,以便我可以进行对象级别的锁定。
现在问题是如何安全地销毁这些对象? 看起来第一步是从查找表中删除对象,以使对象在未来不可访问,这很好。
我想从缓存中释放对象。 现在如何正确销毁/释放mutex? pthread_mutex_destroy文档说,我们不应在mutex被锁定时使用pthread_mutex_destroy。假设一个线程决定销毁对象,则需要销毁锁,以释放锁并执行pthread_mutex_destroy。其他正在等待对象锁的线程会发生什么?
以下是用于模拟上述情况的代码,请注意,我使用sleep(2)来放大竞争的影响。
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
typedef struct exampleObj {
pthread_mutex_t mutex;
int key;
int value1;
int value2;
}exampleObj;
exampleObj sharedObj = {PTHREAD_MUTEX_INITIALIZER,0,0,0};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
exampleObj* Lookup(int key) {
return &sharedObj;
}
void* thrFunc(void* id) {
int i = (*((int*)id));
char errBuf[1024];
exampleObj * obj = Lookup(0);
if (pthread_mutex_lock(&obj->mutex)) {
printf("Locking failed %d \n",i);
return NULL;
}
// Do something
printf("My id %d will do some work for 2 seconds.\n",i);
sleep(2);
pthread_mutex_unlock(&obj->mutex);
int errNum = pthread_mutex_destroy(&obj->mutex);
strerror_r(errNum,errBuf,1024);
printf("Destroying mutex from thread %d : %s\n ",errNum,errBuf);
return NULL;
}
int main() {
pthread_t thrds[10];
int i;
int args[10];
char errBuf[1024];
int errNum = 1;
for (i=0;i<10;i++){
args[i] = i;
pthread_create(&thrds[i],NULL,thrFunc,args+i);
}
for (i=0;i<10;i++){
pthread_join(thrds[i],NULL);
}
return 0;
}
多个线程成功销毁了互斥锁。剩余的线程永久挂起。
Gdb显示这些线程正在等待锁。