Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading pthread mutex,使用pthread_mutex_trylock()进行线程同步_Multithreading_Pthreads - Fatal编程技术网

Multithreading pthread mutex,使用pthread_mutex_trylock()进行线程同步

Multithreading pthread mutex,使用pthread_mutex_trylock()进行线程同步,multithreading,pthreads,Multithreading,Pthreads,我一直在努力获取一个键值哈希字典,我需要做的一件事是在负载因子达到阈值时重新刷新,因此为了确保没有其他线程访问它,我尝试将它降到一个队列中 这是否会成功阻止多个线程同时读/写资源,或者我缺少什么 谢谢 typedef struct { pthread_mutex_t mutex; pthread_cond_t cond; pthread_rwlock_t rw_lock; } thread_conch; typedef struct { thread_conch d_lock;

我一直在努力获取一个键值哈希字典,我需要做的一件事是在负载因子达到阈值时重新刷新,因此为了确保没有其他线程访问它,我尝试将它降到一个队列中

这是否会成功阻止多个线程同时读/写资源,或者我缺少什么

谢谢

typedef struct {
  pthread_mutex_t mutex;
  pthread_cond_t cond;
  pthread_rwlock_t rw_lock;
} thread_conch;

typedef struct {
  thread_conch d_lock;
  size_t elements;
  size_t hash_size;
  struct kv_record **bucket;
} dictionary;

void init_conch(thread_conch *t_lock)
{
  pthread_mutex_init(&t_lock->mutex, NULL);
  pthread_cond_init(&t_lock->cond, NULL);
  pthread_rwlock_init(&t_lock->rw_lock, NULL);
}

void destroy_conch(thread_conch *t_lock)
{
  pthread_mutex_destroy(&t_lock->mutex);
  pthread_cond_destroy(&t_lock->cond);
  pthread_rwlock_destroy(&t_lock->rw_lock);
}

void hold_conch(thread_conch *t_lock)
{
  pthread_rwlock_wrlock(&t_lock->rw_lock);
  while (pthread_mutex_trylock(&t_lock->mutex) != 0)
    ;
}

void read_conch(thread_conch *t_lock)
{
  while (pthread_rwlock_tryrdlock(&t_lock->rw_lock) != 0)
    pthread_cond_wait(&t_lock->cond, &t_lock->mutex);

}
void release_conch(thread_conch *t_lock)
{
  pthread_rwlock_unlock(&t_lock->rw_lock);
  pthread_mutex_unlock(&t_lock->mutex);
  pthread_cond_broadcast(&t_lock->cond);
}

我认为这里的条件变量是不必要的,一个简单的互斥应该可以做到这一点。您还没有发布如何从线程中调用hold_conch/release_conch以及如何创建它们的代码,因此很难说这是否会成功。仔细想想,一个简单的互斥锁是不够的,因为您希望一次允许多个阅读线程,但在写作线程工作时不允许任何阅读线程。我建议您在web上搜索“Readers–writer lock”。我接受了您的建议,合并了读锁,同时仍然使用互斥锁和条件等待读线程,这些线程在写时尝试读取,这样可以吗?本质上,我希望确保资源不可用,并且在写入资源时,任何试图访问它的线程都会被阻止。再次感谢!据我所知,如果使用读写锁,就不需要互斥锁或条件变量,因为整个机制已经为您实现了。您可以从读线程调用pthread_rwlock_rdlock,从写线程调用pthread_rwlock_wrlock,只要初始化正常,就可以解决这个问题。