我究竟如何销毁 pthread 互斥变量?
这是我想做的。我想缓存对象(结构变量),通过键查找。我想在这里有最小的锁粒度。所以我想为每个可能嵌入结构中的对象设置一个锁,这样我就可以进行对象级锁定。
现在的问题是如何安全地销毁这些物体?看起来第一步是从查找表中删除对象,以便将来无法访问该对象,这很好。
我想从缓存中释放对象。现在如何正确销毁/释放互斥锁?pthread_mutex_destroy 文档说我们不应该在互斥锁被锁定时使用 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 显示那些线程正在等待锁。