问题标签 [readwritelock]

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

java - 如何以原子方式替换非同步并发列表或数组

List通过多个线程多次读取(迭代)但很少更新(读取次数超过 50,000 倍)。编辑:事实上,在这种情况下,一个数组就足够了,而不是一个列表。

当列表更新时,它只是用不同的版本替换(没有add()remove()调用)。

CopyOnWriteArrayList避免了同步列表的缺点,但我不确定将列表设置为新值是原子的。我也读过这个问题。

显示一些代码。将以下内容视为单例 Spring bean 的属性。

我是否需要使用ReadWriteLock来实现线程安全集?

0 投票
8 回答
25750 浏览

c++ - 如何从更基本的同步原语制作多读/单写锁?

我们发现在我们的代码中有几个地方,对受互斥体保护的数据的并发读取相当普遍,而写入很少见。我们的测量似乎表明,使用简单的互斥锁会严重影响读取该数据的代码的性能。所以我们需要的是一个多读/单写互斥锁。我知道这可以建立在更简单的原语之上,但在我尝试这样做之前,我宁愿询问现有的知识:

用更简单的同步原语构建多读/单写锁的认可方法是什么?

我确实知道如何做到这一点,但我宁愿得到不受我(可能是错误地)提出的答案的偏见。(注意:我期望的是如何做到这一点的解释,可能是伪代码,而不是完整的实现。我当然可以自己编写代码。)

注意事项:

  • 这需要有合理的表现。(我的想法是每次访问都需要两次锁定/解锁操作。现在这可能还不够好,但需要其中很多似乎是不合理的。)

  • 通常,读取次数更多,但写入比读取更重要且对性能更敏感。读者不能饿死作家。

  • 我们被困在一个相当老的嵌入式平台(VxWorks 5.5 的专有变体)上,有一个相当老的编译器(GCC 4.1.2)和 boost 1.52——除了大部分 boost 的部分依赖于 POSIX,因为 POSIX 没有完全实现在那个平台上。可用的锁定原语基本上是几种信号量(二进制、计数等),在它们之上我们已经创建了互斥锁、条件变量和监视器。

  • 这是 IA32,单核。

0 投票
1 回答
496 浏览

c - C中读写锁的线程安全销毁

我正在尝试使用 POSIX 信号量在 C 中编写线程安全的读写锁。您可以在此处查看源代码的当前状态。我按照这个创建了一个读者首选的锁。

问题是我想为调用 rwl_destroy() 时可能出现的任何可能状态处理锁的破坏。

如果调用了destroy并且没有其他线程在锁上,那么它将锁定wrt(由写入器使用)以防止任何其他线程访问由锁保护的数据。接下来,destroy 函数应该销毁信号量并释放为 ReadWriteLock 结构分配的内存。但是如果另一个线程现在正在等待锁怎么办?根据文档,该线程将处于未定义状态。

这就是我试图避免的,以使锁更易于使用。

编辑:

当前代码是:

我也有这些功能:

所以我的问题是如何更改这些函数以避免我上面描述的未定义状态。是否有可能,或者此代码的用户是否应该在尝试销毁 ReadWriteLock 之前负责释放所有锁?

isActive() 函数和 delFlag 信号量目前没有使用,它们是我试图解决问题的结果。

0 投票
3 回答
241 浏览

java - 使用 Java ReadWriteLock 同步缓存数据——是否将状态变量标记为 volatile?

Oracle的 ReadWriteLock javadoc及其实现描述了锁的作用以及如何使用它,但没有说明是否使用volatile关键字。

这与do-all-mutable-variables-need-to-be-volatile-when-using-locks不是同一个问题,因为我很高兴锁将正确同步访问和可见性,但volatile用于变量仍然是一个好主意,例如用于编译器优化或任何其他原因?

我的缓存数据由一个很少更改的List和几个Maps使用对象的各种属性映射列表中的对象组成。

最好的声明是什么?我有这个:

0 投票
1 回答
5120 浏览

c++ - 如何在 C++14 中实现读/写锁

我有一个哈希表数据结构,我希望通过使用读/写锁来使线程安全(我的读:写比率可能在 100:1 的某个区域)。

我一直在寻找如何使用 C++11 来实现这个锁(比如这里的方法),但我注意到应该可以使用 C++14shared_lock来完成同样的事情。但是,在查看cppreference之后,我发现了两者std::shared_lockstd::unique_lock但我不明白如何一起使用它们(与 Boost 方式相比,Boost 方式具有简单的方法调用来唯一锁定和共享模式)。

如何仅使用标准库在 C++14 中重新创建这个相对简单的读/写锁接口?

0 投票
2 回答
3912 浏览

linux - read_lock 和 write_lock 的优点

我正在学习 read_lock 和 write_lock。

看来我可以使用 spin_lock 而不是读写锁。

所以我想知道使用读写锁有什么好处

当我使用 read_lock 和 write_lock 时,比只使用 spin_lock 有什么好处?

0 投票
2 回答
642 浏览

c - 在 while 循环中逐行读取文件,而另一个函数对其进行更新

我正在从头到尾在 while 循环中读取文件:

该函数delete_line_from_file()从文件中删除传递给它的行。open(fd, O_RDONLY | O_CLOEXEC)它通过++读取整个文件,然后从缓冲区中删除该行并通过read()++将整个缓冲区close()写入同一个文件。被锁定在咨询读锁中,并且被锁定在咨询写锁中。open(fd, O_WRONLY | O_TRUNC | O_CLOEXEC)write()close()read()struct flock lkwrite()

当我读取文件时,有些行会丢失,这与我在写入文件时从头到尾在一个循环中读取文件有关。如果我读入整个文件并逐行浏览缓冲区,则不会遗漏任何行。(到目前为止,这是我首选的解决方案。)在截断和写入文件时也没有出错。循环结束后,丢失的行仍在文件中。

我可以确保我的 while 循环不会遗漏一行并完全清空文件吗?该文件需要逐行清空。它不能被截断。

这是我想到的一种可能的解决方案。通过镜像文件fstat(file &fbuf)并检查它的大小,if (fbuf.st_size !=0) fseek(file, 0, SEEK_SET);但这似乎效率低下。

0 投票
1 回答
757 浏览

java - 如何在java中使用ReadWriteLock实现A Cache?

我的主要问题是“我真的需要重新检查以下代码中 的值”吗?
以下代码描述了如何使用 ReadWriteLock 实现缓存。

}

我是否还需要重新检查'line3'的值?

据我所知,执行到第 3 行时,值对象必须为空,
因为它是一个局部变量(当它为空时),它不能是我们的主 obj:ReadWriteLockCache 的状态变量。
我们真正应该做的是调用get方法,并检查键的值是否被其他线程放置。

代码应该是这样的:

任何人都可以帮忙吗?我说的对吗?我很困惑。

0 投票
4 回答
3233 浏览

java - 为什么要使用读锁?

我读到写锁是独占的,而读锁是共享的,因此在读锁中的一段代码可以被多个线程访问。如果争用的线程没有获得读锁怎么办。无论如何,他们将只读。另外,如果获取读锁的线程试图写东西怎么办?

谢谢

0 投票
1 回答
5268 浏览

java - 同步与 ReadWriteLock 性能

我试图证明当有很多读者而只有一些作者时,同步会更慢。不知何故,我证明了相反的情况。

RW 示例,执行时间为 313 毫秒:

同步示例,执行时间仅为 241ms:

当我的读者比作者多十倍时,为什么同步收集更快。如何显示我在许多文章中读到的 RW 锁的提前?