问题标签 [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 投票
2 回答
282 浏览

c# - 使用 ReaderWriterLock 时,第二个线程是否实际等待

我正在尝试使用两个线程写入文件。如果我使用ReaderWriterLockand 而一个线程正在写入文件并且第二个线程来了,它实际上会等待锁释放还是会跳过写入文件?

0 投票
0 回答
204 浏览

java - 读者数量有限的读者 Writer java

我是一名硕士生,我必须一次为有限数量的读者编写经典读写器问题的代码。我必须使用多线程在 Java 中编写。但是没有信号量。仅使用监视器和关键字同步。我已经得到了一些有效的代码。但我必须将其更改为一次限制为 3 个读者。而且我不知道怎么...

我的代码在下面 读者或作者没有优先权,但我也不想挨饿。但在第一步我只想玩睡觉让我的作家访问日记。谢谢(我必须在接下来的几个小时内这样做)

0 投票
1 回答
96 浏览

c - 分段错误(核心转储)第一个读写器问题

这个作业是关于解决第一个读写器问题。我可以使用 gcc -lpthread -lrt 在 linux 中编译它。但是当我尝试使用给定的格式 readwrtie 100 10 运行它时,我得到了分段错误(核心转储),我不知道为什么。我尝试使用 valgrind a.out 运行以查看问题,但我无法理解。请帮我。

Memcheck,内存错误检测器

==19787== Copyright (C) 2002-2012, and GNU GPL'd, by Julian Seward et al.

==19787== 使用 Valgrind-3.8.1 和 LibVEX;使用 -h 重新运行以获取版权信息

==19787== 命令:a.out

==19787==

==19787== 大小为 1 的读取无效

==19787== 在 0x57E7AC:____strtol_l_internal(在 /lib/libc-2.12.so 中)

==19787== 由 0x57E50F:strtol(在 /lib/libc-2.12.so 中)

==19787== by 0x57AEB0: atoi (in /lib/libc-2.12.so)

==19787== by 0x8048A32: main (in /gaia/class/student/maih/maih-asgmt3/a.out)

==19787== 地址 0x0 没有被堆栈、malloc 或(最近)释放

==19787==

==19787==

==19787== 进程以信号 11 (SIGSEGV) 的默认操作终止

==19787== 访问不在地址 0x0 的映射区域内

==19787== 在 0x57E7AC:____strtol_l_internal(在 /lib/libc-2.12.so 中)

==19787== 由 0x57E50F:strtol(在 /lib/libc-2.12.so 中)

==19787== by 0x57AEB0: atoi (in /lib/libc-2.12.so)

==19787== by 0x8048A32: main (in /gaia/class/student/maih/maih-asgmt3/a.out)

==19787== 如果您认为这是由于堆栈造成的

==19787== 程序主线程溢出(不太可能但

==19787==可能),你可以尝试增加大小

==19787== 使用 --main-stacksize= 标志的主线程堆栈。

==19787== 本次运行使用的主线程堆栈大小为 10485760。

==19787==

==19787== 堆摘要:

==19787== 在退出时使用:0 个块中的 0 个字节

==19787== 总堆使用量:0 分配,0 释放,0 字节分配

==19787==

==19787== 所有堆块都被释放——不可能有泄漏

==19787==

==19787== 对于检测到和抑制的错误计数,重新运行:-v

==19787== 错误摘要:1 个上下文中的 1 个错误(抑制:8 个中的 13 个)

分段错误(核心转储)

0 投票
0 回答
15 浏览

operating-system - 什么是公平的读写锁?

我们如何检查读写锁的公平性?请举一个正在实施这种锁的例子。另外,我需要检查什么来确保锁的正确性?

0 投票
1 回答
35 浏览

c# - 多线程函数中的 LockRecursionException

我不知道如何描述它,但是当代码写得很好时,我得到了一个例外。此异常与 ReaderWriterLockSlim 有关,它是 LockRecursionException;它出现在“ScreenLocker.EnterReadLock();” 线。在我的代码和描述中找不到问题,或者在互联网上可能有什么问题,这就是为什么我在这里写这个问题并向大家寻求帮助。这是我有问题的代码:

这些是此方法调用的函数:

你怎么能看到我在进入 XAxysScan 函数后立即释放锁定。

0 投票
1 回答
199 浏览

java - 使用 Java 线程的读写器问题

我一直在尝试在 Java 中实现读写器问题。但是当Thread.Sleep(5000)被执行时,当前线程进程并没有被中断。

比如第一个reader进入数据库,进程休眠5秒,我想让第二个reader进入数据库。但是在我的代码中,第二个阅读器只有在第一个阅读器醒来并离开数据库后才进入数据库

如何达到我想要的结果?

我刚开始学习 Java,如果我的问题含糊不清,我很抱歉。我很乐意提供更多细节。

编辑:

在复习了一些重要的概念和大量的实践之后,我想出了一个解决方案。有人可以看看它并告诉我它是否可以?我该如何改进它?

这是我第一次使用 stackoverflow 来提问,我被回答吓坏了!!!!!!我非常喜欢这个社区

0 投票
0 回答
33 浏览

linux - linux(或任何操作系统)文件系统如何“准确地”处理并发文件 I/O(内核调度)?

我已经了解了读者作家问题的三种解决方案。

考虑到时间效率,我认为其中三个都可以在现代 OS 文件系统中使用。

我想澄清一下linux如何处理这个问题。(以前没有人提出过这个问题!)

例如,如果访问类似于 RRWRR,那么 linux 如何对这些访问进行排序?

  1. (RR) W (RR) / 无饥饿 (sol 3)
  2. (RRRR) W / 读者偏好
  3. (R) (R) (W) (R) (R) / 一次

谢谢!

0 投票
1 回答
89 浏览

c++ - 关于跨多个线程的shared_mutex和shared_ptr

我实现了这样的代码,以便在不同线程上运行的多个实例使用读写锁和 shared_ptr 读取其他实例的数据。看起来不错,但我对此不是 100% 确定的,我提出了一些关于这些用法的问题。

细节

我有一个名为 Chunk 的类的多个实例,每个实例在专用线程中进行一些计算。一个块需要读取相邻块的数据以及它自己的数据,但它不写入邻居的数据,所以使用读写锁。此外,可以在运行时设置邻居。例如,我可能想在运行时设置一个不同的邻居块,有时只是 nullptr。也可以在运行时删除块。可以使用原始指针,但我认为 shared_ptr 和 weak_ptr 更适合这个,以便跟踪生命周期。shared_ptr 中自己的数据和weak_ptr 中邻居的数据。

我在下面提供了我的代码的更简单版本。ChunkData 有数据和一个互斥体。我使用 InitData 进行数据初始化,之后在专用线程中调用 DoWork 函数。其他函数可以从主线程调用。这似乎有效,但我不是那么自信。特别是关于在多个线程中使用 shared_ptr 。

  1. 如果一个线程调用 shared_ptr 的 reset()(在 ctor 和 InitData 中)而其他线程将它与 weak_ptr 的锁(在 DoWork 中)一起使用,会发生什么?这需要锁dataMutex或chunkMutex吗?

  2. 复制(在 SetNeighbour 中)怎么样?我也需要锁吗?

我认为其他部分还可以,但是如果您发现任何危险,请告诉我。感谢。

顺便说一句,我考虑过存储 Chunk 的 shared_ptr 而不是 ChunkData,但决定不使用这种方法,因为我不管理的内部代码具有 GC 系统,它可以在我不期望的时候删除指向 Chunk 的指针它。

编辑 1

我为 DoWork 函数添加了更多细节。读取块数据并在函数中编辑块的成员变量。

在 Homer512 的回答之后,我提出了其他问题。

A)在 DoWork 函数中,我在读锁中写入了一个成员变量。我是否应该只读取读锁范围内的数据,如果我需要根据读取的数据修改其他数据,是否必须在读锁之外进行?例如,将整个数组复制到读锁中的局部变量,并使用本地修改读锁之外的其他成员。

B)我跟随 Homer512 并修改 GetDataAt/SetDataAt 如下。在解锁 chunkMutex 之前,我会读/写 lock chunkData->dataMutex。我也在 DoWork 函数中这样做。我应该单独做锁吗?例如,创建一个局部变量 shared_ptr 并在 chunkMutex 锁中设置 chunkData 给它,解锁它,然后最后读/写锁定该局部变量的 dataMutex 和读/写数据。