问题标签 [readerwriterlock]

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 回答
1538 浏览

c++ - 使用 WinAPI/C++ 在 Windows 上的进程之间进行多读单写同步锁

有一种众所周知的算法,它使用纯 WinAPI/C++ 在 Windows 平台上的单个进程的线程之间使用读取器/写入器锁同步:

这是一个例子

在我的情况下,我需要在多个进程之间执行此操作,即作者在一个进程中,而读者在其他进程中。知道怎么做吗?

PS。对于一个已经开发的项目,我需要这个,所以我不能使用 C++/MFC 或纯 WinAPI 以外的任何东西。换句话说,我不能使用 Boost 或类似的扩展。

0 投票
1 回答
1119 浏览

c++ - Reader-writer lock with condition variable

I find neither boost nor tbb library's condition variable has the interface of working with reader-writer lock (ie. shared mutex in boost). condition_variable::wait() only accepts mutex lock. But I think it's quite reasonable to have it work with reader-writer lock. Can anyone tell me the reason why they don't support that, or why people don't do that?

Thanks, Cui

0 投票
1 回答
555 浏览

concurrency - 读写器同步问题

我无法理解为什么第一个读写器问题会使写入进程饿死,即:代码如何为读取器进程提供优先级?当其中一个读取器进程执行时,写入器进程是否应该无法获得锁signal(wrt)?信号量列表是结构化的(正如我所见,写入者将如何被 LIFO 列表中稳定的读取器进程流饿死)以优先考虑读取器进程,还是我误解了这里的一些基本内容?

0 投票
2 回答
14355 浏览

c++ - C++ 以最优雅的方式同步线程

我正在尝试解决以下问题,我知道有多种解决方案,但我正在寻找最优雅的方法(更少的代码)来解决它。

我有 4 个线程,其中 3 个尝试在无限循环中将唯一值(0、1 或 2)写入 volatile 整数变量,第四个线程尝试读取此变量的值并将值打印到标准输出也在无限循环中。

我想在线程之间同步,以便运行写入 0 的线程,然后运行“打印”线程,然后运行写入 1 的线程,然后再运行打印线程,依此类推......所以最后我期望在“打印”线程的输出中看到一个零序列,然后是 1 序列,然后是 2,然后是 0,依此类推......

在这些线程之间同步的最优雅和最简单的方法是什么。

这是程序代码:

0 投票
5 回答
1542 浏览

java - 如何在线程中同步getter和setter

我有这个对象。我的应用程序中有这个对象的一个​​实例,一个线程正在写入比率变量,而其他线程正在读取比率。这是保护比率变量的正确方法吗?我需要将比率声明为 volatile 吗?

0 投票
2 回答
9843 浏览

mutex - 互斥锁、信号量和读写锁有什么区别

任何解释每一个的实时场景将不胜感激。除了pthreads中的这些之外,还有其他方法可以处理同步吗?互斥锁与递归互斥锁(任何实时场景)有何不同?

0 投票
1 回答
148 浏览

lock-free - ReaderWriter 无锁实现

我想使用 volatile 值实现一个简单的多读/单写锁。

虽然 _InterlockedXXX 提供了完整的栅栏屏障,如果我是对的,还有“volatile”关键字,我想知道可能的缺陷和改进。我没有获取/释放语义的经验。

我的代码:

另外,如果您知道可以处理此问题的图书馆,请告诉我。

0 投票
4 回答
1136 浏览

c++ - 大尺寸的写入器/读取器缓冲机制-高频数据c ++

我需要一个单一的写入器和多个读取器(最多 5 个)机制,写入器将每个大小几乎 1 MB 的数据和每秒 15 个包连续推送,这将在 c++ 中编写。我正在尝试做的是一个线程不断写入数据,而 5 个读取器将同时根据数据的时间戳进行一些搜索操作。我必须将每个数据包保留 60 分钟,然后才能将它们从容器中取出。

由于数据可以像 15 MB * 60 sec * 60 min = 54000MB/h 一样增长,我需要将近 50 GB 的空间来保存数据并使操作对写入器和读取器都足够快。但是问题是我们不能将这种大小的数据保存在缓存或 RAM 上,所以它必须放在像 SSD 这样的硬盘驱动器中(HDD 对于这种操作来说太慢了)

到目前为止,我一直在想的是,将循环缓冲区(因为我可以计算最大大小)直接实现到 SSD 上,到目前为止我找不到合适的例子,我不知道是否有可能或不可能,或者实现某种映射机制,一个循环数组将在 RAM 中可用,它只保留数据的时间戳和内存的物理地址,以搜索硬盘驱动器上可用的数据. 所以我猜至少搜索操作会更快。

由于任何类型的锁、互斥锁或信号量都会减慢操作速度(尤其是写入至关重要,我们不能因为任何读取操作而丢失数据)我不想使用它们。我知道有一些共享锁可用,但我再次认为它们有一些缺点。有没有办法/想法来实现这种无锁、无等待和线程安全的系统?任何数据结构(容器)、模式、示例代码/项目或其他类型的建议都将受到高度赞赏,谢谢...</p>

编辑:除了更大数量的 RAM,还有其他想法吗?

0 投票
0 回答
51 浏览

multithreading - ReaderWriter Lock,我的代码只是给出了异常

我正在尝试实现 Reader Writer Problem .. 我不知道它有什么问题?
谁能帮我弄清楚为什么?

..................................................... .

它只是给了我越来越多的例外!如果我在没有线程等待的情况下调用 notify() 会有问题吗?

我认为不能在常量字符串或全局对象上调用 wait()。!我在这里见过这个!

0 投票
1 回答
494 浏览

c# - ReaderWriterLock.UpgradeToWriterLock 超时后不抛出异常?

在编写单元测试时,我偶然发现了 ReaderWriterLock 的一个非常奇怪的问题。我尝试使用设置为 50 毫秒的超时选项来测试 UpgradeToWriterLock 方法。

在主线程上,我获取阅读器锁,然后启动许多任务。在任务上,我也使用读卡器锁定,然后尝试在超时的情况下升级到写器。这应该在每一个上都失败,因为主线程正在持有读锁。由于超时为 50 毫秒,因此任务应抛出超时异常并完​​成。如果我开始超过 10 项任务,他们不会。他们卡在 UpgradeToWriterLock 上。

谁能解释一下?整个源代码如下。

有趣的是,如果我在等待任务之前释放主线程读取器锁,一切都会按预期工作。抛出正确数量的超时异常。