问题标签 [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.
locking - 使 pthread_rwlock_wrlock 递归
我对 pthread 函数pthread_rwlock_wrlock的行为有疑问。上面链接的规范指出,当一个线程锁定写锁并且同一个线程再次锁定它时,它会导致未定义的行为(我实际上可以观察到这一点,在 x86 Linux 上调用此函数是一个 noop 而在 PowerPC Linux 上它停止线程)。
我需要的行为是具有以下特征的读写锁:
- 在以下情况下,线程的读锁定成功:
- 锁没有被任何线程持有
- 该锁仅被零个或多个线程(包括调用线程)读锁定,并且可能被调用线程读或写锁定
- 写锁定在以下情况下成功:
- 锁不被任何其他线程持有
- 只有当前线程持有锁(用于读取或写入)
使用 a pthread_mutex_t
,可以通过初始化标志来控制锁的递归性,但这对于 是不可能的pthread_rwlock_t
。
我有哪些选择?我实际上从来没有在 C 中实现这种并发原语,我认为我在这里缺少一些明显的解决方案。
macos - Mac OS X/Darwin 上的递归 pthread_rwlock_rdlock
我有以下通过线程执行的示例代码(请参见下面的代码):
基本上读锁是递归的。它是 POSIX 标准所要求的(要求读锁是递归的,但没有为写锁指定)。这适用于 Linux、FreeBSD、Solaris,但不适用于 Darwin/Mac OS X。
下面的示例在 Linux 上提供以下输出:
在达尔文上打印:
而这里的死锁(不继续),基本上是不尊重递归读锁的。
有什么可以做的(标记、定义、链接到一个特殊的库版本)可以按预期工作吗?
示例代码
locking - 如何在 FreeBSD 中创建进程间 rwlock?
在 FreeBSD 中创建进程间读写锁的方法是什么?我正在寻找类似 pthread 的 rwlock 的东西,它可以通过在 Linux 中成功运行的“pthread_rwlockattr_setpshared”和 PTHREAD_PROCESS_SHARED 标志设置为在进程之间共享。但是 FreeBSD 不支持这个标志。先感谢您。
boost - RWLock 使用 boost shared_mutex、unique_lock 和 shared_lock
我正在尝试实现 RWLock 接口
通过使用boost::shared_mutex
和。boost::unique_lock
boost::shared_lock
我遇到的问题是boost::shared_lock
/boost::unique_lock
正在使用 RAII 并且应该是每个线程一个实例(不是我需要的共享)。我没有设法根据需要在两个单独的操作中中断获取和释放。
这可以以某种方式解决吗?
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) 释放锁
linux-kernel - 如何初始化 rwlock_t
我正在编写一个 linux 内核模块,但找不到初始化读写锁的方法。我更喜欢静态初始化。
当我尝试使用 RW_LOCK_UNLOCKED 时,编译器告诉我它没有定义。
multithreading - pthread rwlock 从不同的线程锁定/解锁
文档说从一个线程锁定并从另一个 rwlock 解锁会导致未定义的行为。我有一个数组和两个线程,一个分配它,一个释放它,这发生在一个循环中,并且还有一些线程在其中读/写,但它们从不重叠,因此那里不需要同步。问题是读/写线程仍然尝试在 dealloc - alloc 之间的时间范围内使用数组。我正在考虑为读/写线程使用读锁并锁定数组以在 dealloc 线程中写入并在分配线程中解锁写入。但这会导致未定义的行为,因为它们发生在不同的线程上。在这种情况下,正确的方法是什么?
c++ - 我收到此错误:错误 c2064:术语不评估为采用 0 个参数的函数,但我不明白为什么
我遇到了这个错误:错误 c2064:术语不评估为采用 0 个参数的函数。问题是该函数接受 0 个参数,我调用 0 个参数,但我不明白出了什么问题。
这就是对函数的调用。这是功能:
有人知道问题是什么吗?提前致谢!
linux - 为什么Linux内核的rwlock_t的lock字段是unsigned int
在 Linux 2.6.11.12 中,rwlock_t
定义如下:
在 的定义中rwlock_t
,lock
字段是unsigned int
。当我们要获得读锁时,read_lock()
最终会调用_raw_read_trylock()
在这个函数中,我们调用atomic_dec()
减少lock
并检查它是否大于或等于零。但由于lock
是一个unsigned int
,lock
将永远大于 0!也就是说,此函数将始终返回 1。
我猜想atomic_read()
将结果转换为 a int
,但在 i386 拱门中,它被定义为
而且我不知道如何unsigned int lock
工作。
go - 在 Golang 中阅读首选 RW 互斥锁
我需要在 golang 中阅读首选 RW互斥锁。golang 中是否有一个包可以满足我的需求。我试过sync.RWMutex,但它似乎是写首选锁。这是我区分 Go 的 RWMutex 的尝试,
输出:
第二个读者一直等待直到作者释放锁。