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

sql-server - 设计表以支持使用 sql server 更快地更新一个字段的最佳实践

我正在研究类似系统的工作流。我有一个任务表和状态字段。status 的值可以是 New、ready、processing、error、abort、done 之一。

我有大约 7 个进程,它们将根据不同的情况触发以更改任务状态的值。大多数情况下,每个进程都将处理自己的数据集,并且每次最多只能处理 5000 条记录。但是如果数据达到大约 200 万条记录,我仍然会看到一些僵局。我用 SQL Profiler 检查,看起来像是一些相关的页面资源。我不擅长 sql server 性能调优,也不是很了解。

由于每天都会归档非活动任务,因此我正在考虑重新设计表格以支持大约 1000 万条记录。

几个选择可能是:

  1. 根据状态创建拆分表。
  2. 根据状态创建包含静态数据和支持的表的主表

这种情况有什么好的做法吗?

谢谢!

0 投票
2 回答
221 浏览

c++ - 此用例是否需要读写锁

我的问题与此线程类似,但是我确定在给定线程中得出的结论是否适用于此。

我的用例:在应用程序中,有一个状态线程每 1 秒发送一次相同的文本信息。文本信息包含应用程序组名称。状态读取器使用此状态来确定应用程序服务器是否打开/关闭。

现在应用程序组名称可以在其生命周期内更改。由于某些用户活动,确保只有应用程序中的单个线程触发此事件。现在这个单线程有我需要更新到我的状态线程的新应用程序组名称。

我目前的实现如下

  1. 状态线程 Main() Take ReadLock 读取应用组名 Release the ReadLock

    发送状态

  2. Updater Thread Main() 获取写锁 更新组名 释放 WriteLock

但是,由于要发送大量更新,我担心我可能会因重负载而导致性能下降。所以我正在努力执行以下操作,但我不确定这是否可行。

新提议的实施是

  1. 发送者线程持有 char* ptr、char[1024] primaryData、char[1024] secondaryData。
  2. 首次启动应用程序时,组名在 primaryData 中更新,并且 ptr 指向 primaryData。
  3. 每当更新线程有更新事件时,它会检查是否 (ptr == primaryData) 将新应用程序名称复制到辅助数据 ptr = secondaryData else 将新应用程序名称复制到primaryData。ptr = 主数据
  4. 状态线程将始终使用 ptr 指向的数据来发送状态。状态线程最终将接收更新的 ptr(考虑缓存一致性)并将开始传输新数据。

这里有几点需要考虑。1.即使状态线程不能立即获得新数据也没关系 2.我不希望由于无效的内存访问而导致程序崩溃。

朋友们,你能告诉我上面的逻辑是否能帮助我避免读写锁。

0 投票
2 回答
1994 浏览

c# - 在许多属性中使用 ReaderWriterLockSlim 的更简洁的方法

我正在尝试实现许多利用 ReaderWriterLockSlim 实现线程安全的属性。所以像大多数人一样,我最终在我的所有属性中都得到了这样的结果:

这在 10 个属性中感觉非常冗长和重复,因此我正在寻找更 DRY 的实现。

显而易见的解决方案是将它包装到一个类中,该类释放 dispose 的锁并允许我将线程安全操作放在 using 语句中。根据这个和其他一些来源,显然这不是很安全。

所以我尝试使用 lambda 表达式和匿名方法想出一个漂亮的解决方案:

虽然这消除了让我烦恼的重复代码,但我不知道它是否与我最初的详细实现一样线程安全。

是否有人对 MSIL 这将产生和多线程理论有更深入的了解,能够告诉我我的实现是否安全?

0 投票
3 回答
1923 浏览

c++ - std:map 和 std:set 的线程安全

可能重复:
我是否需要在多线程环境中保护对 STL 容器的读取访问?

如果某个线程读取 :set 或 :map 而另一个线程写入该 set 或 map,会发生什么?例外?

现在我使用读写锁,但我想删除锁,因为写操作不经常,读操作很频繁。

0 投票
2 回答
4600 浏览

java - Java:具有优先级的 ReentrantReadWriteLock

以下是典型的读写器模式(读多写少)

我想知道是否可以优先考虑作者和读者?例如,如果其他线程不断持有读锁,通常 writer 可能会等待很长时间(可能永远),所以是否可以让 writer 具有更高的优先级,所以每当 writer 到来时,它可以被认为是高优先级(跳线)之类的。

0 投票
4 回答
47587 浏览

c++ - 您将如何在 C++11 中实现自己的读/写锁?

我有一组需要用读/写锁保护的数据结构。我知道 boost::shared_lock,但我想有一个使用 std::mutex、std::condition_variable 和/或 std::atomic 的自定义实现,以便我可以更好地理解它是如何工作的(稍后再调整它) .

每个数据结构(可移动,但不可复制)都将继承自一个名为 Commons 的类,该类封装了锁定。我希望公共界面看起来像这样:

...这样它就可以被某些人公开继承:

我正在编写科学代码,通常可以避免数据竞争;这个锁主要是为了防止我以后可能会犯的错误。因此,我的优先级是低读取开销,因此我不会过多地妨碍正确运行的程序。每个线程可能会在自己的 CPU 内核上运行。

你能告诉我(伪代码可以)一个读者/作者锁吗?我现在拥有的应该是防止作家饥饿的变体。到目前为止,我的主要问题是 read_lock 在检查读取是否安全与实际增加读取器计数之间存在差距,之后 write_lock 知道要等待。

我对多线程有点陌生,我真的很想了解它。在此先感谢您的帮助!

0 投票
2 回答
1130 浏览

c++ - QReadWriteLock 递归

我在递归模式下使用 QReadWriteLock。

这段代码本身没有意义,但我从这里出现的问题:

lockForRead 被阻止。请注意,这是在递归模式下。

我看到它的方式是 Write 是一个“高级”锁,它允许我读取和写入受保护的数据,而 Read lock 只允许读取。

另外,我认为如果唯一的读者是同一个请求写锁的读者,则不应阻止写锁。

我可以从 qreadwritelock.cpp 源代码中看到,没有尝试让它像我想要的那样工作。所以这不是错误,而是我发现缺少的功能。

我的问题是,应该允许这种递归吗?这种实施是否会出现任何问题?它们会是什么?

0 投票
3 回答
1150 浏览

java - Java同步性能

我想对此发表意见以解决一个小纠纷。任何帮助将不胜感激。

我已经编写了自己的附加到记录器的文件处理程序。这是一个文件处理程序并被多个线程访问,我使用同步以确保在写入过程中没有冲突。此外,它是一个滚动日志,所以我也关闭和打开文件,也不希望出现任何问题。

他对此的回应是(从电子邮件中粘贴)

我坚信处理程序中的同步非常糟糕。对于这样简单的任务来说太复杂了。所以,我会说为什么不为每个线程使用一个实例?

从性能和内存管理的角度来看,您会说什么更好。非常感谢您的任何回复。每当在多线程应用程序中涉及写入和读取时,我一生都在 java 应用程序上使用同步,并且没有听说过任何严重的性能问题。

所以请我想知道是否有任何问题,我真的应该每个线程切换到一个实例。

一般来说,使用同步的缺点是什么?

编辑:我编写自定义文件处理程序(是的,我确实喜欢 slf4j)的原因是因为我的自定义处理程序同时处理两个文件,此外,除了写入文件之外,我还执行了一些其他功能。

0 投票
1 回答
784 浏览

java - 使用双重检查锁实现读写锁

我写了一个Java ReadWriteLock,读者使用双重检查锁定来获取写锁。这是不安全的(就像带有惰性实例化的 DCL 的情况一样)?

我知道 Java 已经有了 ReentrantReadWriteLock。我对如何确定哪种形式的 DCL 安全或不安全的一般问题更感兴趣?

0 投票
2 回答
886 浏览

c++ - 使用 WinAPI 的多读/单写锁

是否有常用的“最佳实践”读写锁 WinAPI 实现?我只找到了一种实现,不知道它是否可靠。