pthread 读写锁不起作用?
Is pthread read write lock not working?
我正在使用 pthread read write lock 来允许一个写线程到共享内存,多个读线程从共享内存读取。内存是一个包含文件描述符(写入和读取磁盘)的结构:
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
如果您正在使用共享内存,您可能有不同的进程,而不仅仅是不同的线程。因此,您需要将 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 网站上看不到)。
我正在使用 pthread read write lock 来允许一个写线程到共享内存,多个读线程从共享内存读取。内存是一个包含文件描述符(写入和读取磁盘)的结构:
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
如果您正在使用共享内存,您可能有不同的进程,而不仅仅是不同的线程。因此,您需要将 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 网站上看不到)。