我如何才能销毁pthread互斥变量?
这是我想做的。我想缓存对象(结构变量),按键查找。我想在这里拥有最小的锁粒度。所以我想为可能嵌入在结构中的每个对象设置一个锁,以便可以进行对象级锁定。
现在的问题是如何安全地销毁这些物体?看起来第一步似乎是从查找表中删除该对象,以便将来无法访问该对象。
我想从缓存中释放对象。现在如何正确销毁/释放互斥锁?pthread_mutex_destroy文档说互斥锁处于锁定状态时,我们不应使用pthread_mutex_destroy。可以说一个线程决定销毁它需要销毁锁的对象,因此它释放锁并执行pthread_mutex_destroy。等待对象锁定的其他线程会怎样?
这是模拟以上代码的代码,请注意我使用sleep(2)来放大race的影响。
#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 …Run Code Online (Sandbox Code Playgroud) 此代码取自理查德史蒂文斯撰写的UNIX环境中的第3版高级编程.这是如何制作可重入版本的示例getenv().这里只是为了学习目的.
/* Copyright (c) W.R.Stevens */
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <stdlib.h>
extern char **environ;
pthread_mutex_t env_mutex;
static pthread_once_t init_done = PTHREAD_ONCE_INIT;
static void
thread_init(void)
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&env_mutex, &attr);
pthread_mutexattr_destroy(&attr);
}
int
getenv_r(const char *name, char *buf, int buflen)
{
int i, len, olen;
pthread_once(&init_done, thread_init);
len = strlen(name);
pthread_mutex_lock(&env_mutex);
for (i = 0; environ[i] != NULL; i++) {
if ((strncmp(name, environ[i], len) == 0) &&
(environ[i][len] == '=')) {
olen = …Run Code Online (Sandbox Code Playgroud)