问题标签 [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.
java - 如何以原子方式替换非同步并发列表或数组
我List
通过多个线程多次读取(迭代)但很少更新(读取次数超过 50,000 倍)。编辑:事实上,在这种情况下,一个数组就足够了,而不是一个列表。
当列表更新时,它只是用不同的版本替换(没有add()
或remove()
调用)。
CopyOnWriteArrayList避免了同步列表的缺点,但我不确定将列表设置为新值是原子的。我也读过这个问题。
显示一些代码。将以下内容视为单例 Spring bean 的属性。
我是否需要使用ReadWriteLock来实现线程安全集?
c++ - 如何从更基本的同步原语制作多读/单写锁?
我们发现在我们的代码中有几个地方,对受互斥体保护的数据的并发读取相当普遍,而写入很少见。我们的测量似乎表明,使用简单的互斥锁会严重影响读取该数据的代码的性能。所以我们需要的是一个多读/单写互斥锁。我知道这可以建立在更简单的原语之上,但在我尝试这样做之前,我宁愿询问现有的知识:
用更简单的同步原语构建多读/单写锁的认可方法是什么?
我确实知道如何做到这一点,但我宁愿得到不受我(可能是错误地)提出的答案的偏见。(注意:我期望的是如何做到这一点的解释,可能是伪代码,而不是完整的实现。我当然可以自己编写代码。)
注意事项:
这需要有合理的表现。(我的想法是每次访问都需要两次锁定/解锁操作。现在这可能还不够好,但需要其中很多似乎是不合理的。)
通常,读取次数更多,但写入比读取更重要且对性能更敏感。读者不能饿死作家。
我们被困在一个相当老的嵌入式平台(VxWorks 5.5 的专有变体)上,有一个相当老的编译器(GCC 4.1.2)和 boost 1.52——除了大部分 boost 的部分依赖于 POSIX,因为 POSIX 没有完全实现在那个平台上。可用的锁定原语基本上是几种信号量(二进制、计数等),在它们之上我们已经创建了互斥锁、条件变量和监视器。
这是 IA32,单核。
c - C中读写锁的线程安全销毁
我正在尝试使用 POSIX 信号量在 C 中编写线程安全的读写锁。您可以在此处查看源代码的当前状态。我按照这个创建了一个读者首选的锁。
问题是我想为调用 rwl_destroy() 时可能出现的任何可能状态处理锁的破坏。
如果调用了destroy并且没有其他线程在锁上,那么它将锁定wrt(由写入器使用)以防止任何其他线程访问由锁保护的数据。接下来,destroy 函数应该销毁信号量并释放为 ReadWriteLock 结构分配的内存。但是如果另一个线程现在正在等待锁怎么办?根据文档,该线程将处于未定义状态。
这就是我试图避免的,以使锁更易于使用。
编辑:
当前代码是:
我也有这些功能:
所以我的问题是如何更改这些函数以避免我上面描述的未定义状态。是否有可能,或者此代码的用户是否应该在尝试销毁 ReadWriteLock 之前负责释放所有锁?
isActive() 函数和 delFlag 信号量目前没有使用,它们是我试图解决问题的结果。
java - 使用 Java ReadWriteLock 同步缓存数据——是否将状态变量标记为 volatile?
Oracle的 ReadWriteLock javadoc及其实现描述了锁的作用以及如何使用它,但没有说明是否使用volatile
关键字。
这与do-all-mutable-variables-need-to-be-volatile-when-using-locks不是同一个问题,因为我很高兴锁将正确同步访问和可见性,但volatile
用于变量仍然是一个好主意,例如用于编译器优化或任何其他原因?
我的缓存数据由一个很少更改的List
和几个Maps
使用对象的各种属性映射列表中的对象组成。
最好的声明是什么?我有这个:
c++ - 如何在 C++14 中实现读/写锁
我有一个哈希表数据结构,我希望通过使用读/写锁来使线程安全(我的读:写比率可能在 100:1 的某个区域)。
我一直在寻找如何使用 C++11 来实现这个锁(比如这里的方法),但我注意到应该可以使用 C++14shared_lock
来完成同样的事情。但是,在查看cppreference之后,我发现了两者std::shared_lock
,std::unique_lock
但我不明白如何一起使用它们(与 Boost 方式相比,Boost 方式具有简单的方法调用来唯一锁定和共享模式)。
如何仅使用标准库在 C++14 中重新创建这个相对简单的读/写锁接口?
linux - read_lock 和 write_lock 的优点
我正在学习 read_lock 和 write_lock。
看来我可以使用 spin_lock 而不是读写锁。
所以我想知道使用读写锁有什么好处
当我使用 read_lock 和 write_lock 时,比只使用 spin_lock 有什么好处?
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 lk
write()
当我读取文件时,有些行会丢失,这与我在写入文件时从头到尾在一个循环中读取文件有关。如果我读入整个文件并逐行浏览缓冲区,则不会遗漏任何行。(到目前为止,这是我首选的解决方案。)在截断和写入文件时也没有出错。循环结束后,丢失的行仍在文件中。
我可以确保我的 while 循环不会遗漏一行并完全清空文件吗?该文件需要逐行清空。它不能被截断。
这是我想到的一种可能的解决方案。通过镜像文件fstat(file &fbuf)
并检查它的大小,if (fbuf.st_size !=0) fseek(file, 0, SEEK_SET);
但这似乎效率低下。
java - 如何在java中使用ReadWriteLock实现A Cache?
我的主要问题是“我真的需要重新检查以下代码中
的值”吗?
以下代码描述了如何使用 ReadWriteLock 实现缓存。
}
我是否还需要重新检查'line3'的值?
据我所知,执行到第 3 行时,值对象必须为空,
因为它是一个局部变量(当它为空时),它不能是我们的主 obj:ReadWriteLockCache 的状态变量。
我们真正应该做的是调用get方法,并检查键的值是否被其他线程放置。
代码应该是这样的:
任何人都可以帮忙吗?我说的对吗?我很困惑。
java - 为什么要使用读锁?
我读到写锁是独占的,而读锁是共享的,因此在读锁中的一段代码可以被多个线程访问。如果争用的线程没有获得读锁怎么办。无论如何,他们将只读。另外,如果获取读锁的线程试图写东西怎么办?
谢谢
java - 同步与 ReadWriteLock 性能
我试图证明当有很多读者而只有一些作者时,同步会更慢。不知何故,我证明了相反的情况。
RW 示例,执行时间为 313 毫秒:
同步示例,执行时间仅为 241ms:
当我的读者比作者多十倍时,为什么同步收集更快。如何显示我在许多文章中读到的 RW 锁的提前?