【发布时间】:2016-05-07 05:52:57
【问题描述】:
我正在使用 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
【问题讨论】:
-
这可能是您的代码中的一些缺陷。通常 rwlocks 工作正常..
-
你到底遇到了什么问题?
-
您在谈论一些名为
file的字段,但您只操作r。您是否有机会在重命名器关键部分之外分配它?也适用于读者 - 你有保护实际阅读的锁吗?搜索结果可能会在 离开临界区后发生变化。 -
文件名在读线程搜索时被破坏,导致段错误。它追溯到二进制搜索。这意味着当读取线程尝试访问文件时,写入仍在进行中。临界区是二分查找。我假设通过在锁中包装二进制搜索,二进制搜索中读取的文件受到保护?
-
file_exists是如何实现的?
标签: c++ c multithreading pthreads mutex