pthread读写锁不起作用吗? [关闭]

Posted

技术标签:

【中文标题】pthread读写锁不起作用吗? [关闭]【英文标题】:Is pthread read write lock not working? [closed] 【发布时间】: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 是如何实现的? 【参考方案1】:

如果您使用共享内存,您可能有不同的进程,而不仅仅是不同的线程。因此,您需要将 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。发现问题:打开的文件太多。 啊啊!!我讨厌这个限制。

以上是关于pthread读写锁不起作用吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C++ 互斥锁不起作用 - 同步失败

添加到地图的类中的互斥锁不起作用c ++

sqlyog的f12不起作用

pthread_sigmask 在信号处理程序中不起作用

Linux:pthread_cond_signal() 在 Signal Handler() 中不起作用

PHP.INI不起作用