相关疑难解决方法(0)

如何正确销毁pthread互斥锁

我如何才能销毁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)

multithreading mutex locking pthreads

5
推荐指数
1
解决办法
2万
查看次数

pthread:破坏全局静态互斥体

此代码取自理查德史蒂文斯撰写的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)

c pthreads reentrancy

3
推荐指数
1
解决办法
1277
查看次数

标签 统计

pthreads ×2

c ×1

locking ×1

multithreading ×1

mutex ×1

reentrancy ×1