C++ pthread读写锁不工作吗?
我使用pthread read write lock来允许一个写线程访问共享内存,并允许多个读线程访问共享内存。内存是一个包含文件描述符(写入磁盘和从磁盘读取)的结构: 每隔一段时间,写入线程将从磁盘中的文件读取数据,创建新文件,删除旧文件,并更新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
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);