pthread读写锁不起作用吗?

时间:2016-05-07 05:52:57

标签: c++ c multithreading pthreads mutex

我正在使用pthread读写锁定来允许一个写入线程到共享内存,以及几个读取线程从共享内存中读取。内存是一个包含文件描述符(写入和读取磁盘)的结构:

typedef struct A{
  ... 
  pthread_rwlock_t rw_lock;  
  b_t* file; 
} A_t;

一段时间后,写线程将从磁盘中的文件读取,创建新文件,删除旧文件,并更新b_t* file以指向新文件。读线程将随时从磁盘中的文件中读取。为了避免竞争条件,我在内存上使用了pthread读写锁。当写入线程删除文件并更新b_t* file时,它会获取锁定:

  pthread_rwlock_wrlock(&A_instance.rw_lock);  

  // destroy next level in disk 
  int r = unlink(filename);

  // rename tmp to be next level file 
  r = rename(tmp_fname, filename);

  pthread_rwlock_unlock(&A_instance.rw_lock);  

当读取线程搜索文件时,它获取锁定,如下所示:

int search(int key){
    int err = pthread_rwlock_rdlock(& A_instance.rw_lock);
    int r = binary_search_in_disk(key);   
    pthread_rwlock_unlock(&A_instance.rw_lock);
    return r; 
}

编辑:此处发生错误:

int binary_search_in_disk(key){
  if (!file_exist(filename)){
    return -1;
  }

  FILE* file = fopen(filename, "r”);
  int key;

  num = fscanf(file, "%d%\n", &key);  // error

1 个答案:

答案 0 :(得分:2)

如果您使用共享内存,则可能有不同的进程,而不仅仅是不同的线程。因此,您需要将rwlock的 process-shared 属性设置为PTHREAD_PROCESS_SHARED。因此初始化代码需要看起来像(为了清楚起见,错误检查已被省略):

    pthread_rwlockattr_t attr;
    pthread_rwlockattr_init(&attr);
    pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

    pthread_rwlock_init(&rwlock, &attr);

(感觉应该采用更加明确的方式来做到这一点,但我无法在OpenGroup网站上看到一个)。