Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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
C++ pthread读写锁不工作吗?_C++_C_Multithreading_Pthreads_Mutex - Fatal编程技术网

C++ pthread读写锁不工作吗?

C++ pthread读写锁不工作吗?,c++,c,multithreading,pthreads,mutex,C++,C,Multithreading,Pthreads,Mutex,我使用pthread read write lock来允许一个写线程访问共享内存,并允许多个读线程访问共享内存。内存是一个包含文件描述符(写入磁盘和从磁盘读取)的结构: 每隔一段时间,写入线程将从磁盘中的文件读取数据,创建新文件,删除旧文件,并更新b_*t*file以指向新文件。读取线程将随时从磁盘中的文件中读取。为了避免争用情况,我在内存上使用pthread读写锁。当写入线程删除文件并更新b_*t文件时,它将获得锁: pthread_rwlock_wrlock(&A_instanc

我使用pthread read write lock来允许一个写线程访问共享内存,并允许多个读线程访问共享内存。内存是一个包含文件描述符(写入磁盘和从磁盘读取)的结构:

每隔一段时间,写入线程将从磁盘中的文件读取数据,创建新文件,删除旧文件,并更新
b_*t*file
以指向新文件。读取线程将随时从磁盘中的文件中读取。为了避免争用情况,我在内存上使用pthread读写锁。当写入线程删除文件并更新
b_*t文件
时,它将获得锁:

  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

如果您使用的是共享内存,那么您可能有不同的进程,而不仅仅是不同的线程。因此,您需要将rwlock的process shared属性设置为
PTHREAD\u process\u shared
。因此,初始化代码需要如下所示(为了清晰起见,省略了错误检查):


(感觉应该有一种更为透明的方法来实现这一点,但我在OpenGroup网站上看不到这种方法)。

这可能是您的代码中的一些缺陷。通常情况下,rBlock工作得很好。具体来说,您在使用它时遇到了什么问题?您正在谈论一个名为
文件
的字段,但您只操作
r
。您是否有可能将其分配到重命名器关键部分之外?同样对于读卡器-您是否有一个锁来保护实际读取?离开临界区后,搜索结果可能会更改。读取线程搜索时文件名已被破坏,这会导致seg错误。它可以追溯到二进制搜索。这意味着当读取线程试图访问文件时,写入仍在进行中。关键部分是二进制搜索。我假设通过将二进制搜索包装到锁中,二进制搜索中的文件读取受到保护?文件是如何存在的?实现的?Thx Martin!问题不是pthread。发现问题:打开的文件太多。啊!!我讨厌这个限制。
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
    pthread_rwlockattr_t attr;
    pthread_rwlockattr_init(&attr);
    pthread_rwlockattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);

    pthread_rwlock_init(&rwlock, &attr);