问题标签 [rwlock]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3684 浏览

locking - 使 pthread_rwlock_wrlock 递归

我对 pthread 函数pthread_rwlock_wrlock的行为有疑问。上面链接的规范指出,当一个线程锁定写锁并且同一个线程再次锁定它时,它会导致未定义的行为(我实际上可以观察到这一点,在 x86 Linux 上调用此函数是一个 noop 而在 PowerPC Linux 上它停止线程)。

我需要的行为是具有以下特征的读写锁:

  • 在以下情况下,线程的读锁定成功:
    • 锁没有被任何线程持有
    • 该锁仅被零个或多个线程(包括调用线程)读锁定,并且可能被调用线程读或写锁定
  • 写锁定在以下情况下成功:
    • 锁不被任何其他线程持有
    • 只有当前线程持有锁(用于读取或写入)

使用 a pthread_mutex_t,可以通过初始化标志来控制锁的递归性,但这对于 是不可能的pthread_rwlock_t

我有哪些选择?我实际上从来没有在 C 中实现这种并发原语,我认为我在这里缺少一些明显的解决方案。

0 投票
2 回答
1134 浏览

macos - Mac OS X/Darwin 上的递归 pthread_rwlock_rdlock

我有以下通过线程执行的示例代码(请参见下面的代码):

基本上读锁是递归的。它是 POSIX 标准所要求的(要求读锁是递归的,但没有为写锁指定)。这适用于 Linux、FreeBSD、Solaris,但不适用于 Darwin/Mac OS X。

下面的示例在 Linux 上提供以下输出:

在达尔文上打印:

而这里的死锁(不继续),基本上是不尊重递归读锁的。

有什么可以做的(标记、定义、链接到一个特殊的库版本)可以按预期工作吗?


示例代码

0 投票
1 回答
827 浏览

locking - 如何在 FreeBSD 中创建进程间 rwlock?

在 FreeBSD 中创建进程间读写锁的方法是什么?我正在寻找类似 pthread 的 rwlock 的东西,它可以通过在 Linux 中成功运行的“pthread_rwlockattr_setpshared”和 PTHREAD_PROCESS_SHARED 标志设置为在进程之间共享。但是 FreeBSD 不支持这个标志。先感谢您。

0 投票
0 回答
513 浏览

boost - RWLock 使用 boost shared_mutex、unique_lock 和 shared_lock

我正在尝试实现 RWLock 接口

通过使用boost::shared_mutex和。boost::unique_lockboost::shared_lock

我遇到的问题是boost::shared_lock/boost::unique_lock正在使用 RAII 并且应该是每个线程一个实例(不是我需要的共享)。我没有设法根据需要在两个单独的操作中中断获取和释放。

这可以以某种方式解决吗?

0 投票
2 回答
3449 浏览

c - pthread rwlock:wrlock 内的rdlock

情况:

  • 程序正在使用pthread_rwlock_t,比如说foolock
  • 一个线程,比如 T1,pthread_rwlock_wrlock()foolock
  • T1 尝试获取读锁 ( pthread_rwlock_rdlock()) onfoolock
  • 没有其他线程拥有读锁或写锁foolock
  • 有匹配的解锁。

预计会发生什么?

程序(特别是 T1)收到一个错误:

选择这种行为的动机是什么?如果授予读锁会出现什么问题?

什么可能是解决这种情况的好方法?或许,T1 需要维护一些它已经持有写锁的状态foolock。还有什么建议吗?

我的测试平台是Linux 2.6.32-431.11.2.el6.x86_64,NPTL 2.12

编辑1:很少澄清:

  • 我不是想将读锁升级为写锁
  • 我不是想将写锁降级为读锁
  • 我正在探索在已经获得写锁时是否可以授予读锁请求。

简化上下文:

  • 我正在尝试提供两个公共 API:(1)find()和 (2)update()
  • find()采用读锁
  • update()使用写锁
  • update()实现要调用 find() <<--问题

我目前的做法是:

  • 让每个公共API都有对应的无锁私有版本
  • 公共 API 执行 3 个步骤:

    • (a) 获得适当的锁,
    • (b) 调用私人版本,
    • (c) 释放锁
0 投票
1 回答
1332 浏览

linux-kernel - 如何初始化 rwlock_t

我正在编写一个 linux 内核模块,但找不到初始化读写锁的方法。我更喜欢静态初始化。

当我尝试使用 RW_LOCK_UNLOCKED 时,编译器告诉我它没有定义。

0 投票
1 回答
483 浏览

multithreading - pthread rwlock 从不同的线程锁定/解锁

文档说从一个线程锁定并从另一个 rwlock 解锁会导致未定义的行为。我有一个数组和两个线程,一个分配它,一个释放它,这发生在一个循环中,并且还有一些线程在其中读/写,但它们从不重叠,因此那里不需要同步。问题是读/写线程仍然尝试在 dealloc - alloc 之间的时间范围内使用数组。我正在考虑为读/写线程使用读锁并锁定数组以在 dealloc 线程中写入并在分配线程中解锁写入。但这会导致未定义的行为,因为它们发生在不同的线程上。在这种情况下,正确的方法是什么?

0 投票
2 回答
3863 浏览

c++ - 我收到此错误:错误 c2064:术语不评估为采用 0 个参数的函数,但我不明白为什么

我遇到了这个错误:错误 c2064:术语不评估为采用 0 个参数的函数。问题是该函数接受 0 个参数,我调用 0 个参数,但我不明白出了什么问题。

这就是对函数的调用。这是功能:

有人知道问题是什么吗?提前致谢!

0 投票
0 回答
178 浏览

linux - 为什么Linux内核的rwlock_t的lock字段是unsigned int

在 Linux 2.6.11.12 中,rwlock_t定义如下:

在 的定义中rwlock_tlock字段是unsigned int。当我们要获得读锁时,read_lock()最终会调用_raw_read_trylock()

在这个函数中,我们调用atomic_dec()减少lock并检查它是否大于或等于零。但由于lock是一个unsigned intlock将永远大于 0!也就是说,此函数将始终返回 1。

我猜想atomic_read()将结果转换为 a int,但在 i386 拱门中,它被定义为

而且我不知道如何unsigned int lock工作。

0 投票
2 回答
6533 浏览

go - 在 Golang 中阅读首选 RW 互斥锁

我需要在 golang 中阅读首选 RW互斥锁。golang 中是否有一个包可以满足我的需求。我试过sync.RWMutex,但它似乎是写首选锁。这是我区分 Go 的 RWMutex 的尝试,

输出:

第二个读者一直等待直到作者释放锁。