gpt4 book ai didi

c++ - pthread读写锁不起作用吗?

转载 作者:行者123 更新时间:2023-11-30 21:20:33 36 4
gpt4 key购买 nike

我正在使用 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

最佳答案

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

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

pthread_rwlock_init(&rwlock, &attr);

(感觉应该有一种更明确的方式来执行此操作,但我在 OpenGroup 网站上看不到这种方式)。

关于c++ - pthread读写锁不起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37085022/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com