问题标签 [synclock]

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

.net - Synclock 和 WaitOne 的区别

我使用了一个线程管理的服务员。

同步锁 http://msdn.microsoft.com/en-us/library/3a86s51t%28v=vs.71%29.aspx

但是现在,我想暂停一下,然后找到了 WaitOne。

WaitOne http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitone.aspx 支持简单的超时。

但它不再起作用了。可能是代码中的其他地方出现了错误。SyncLock我的主要问题是,使用和WaitOne作为基本服务员标志有区别吗?

问候

0 投票
1 回答
309 浏览

.net - 用于异步操作的 SyncLock

我有一个由 AsyncOperation 通过 .Post() 调用的方法 Update()。当我在该函数中放置一个 MessageBox 时,我得到了多个消息框,我试图理解为什么会发生这种情况。

消息框应停止执行 Update(),直到单击“确定”,但由于 .Post(),我重新进入 Update(),导致下一个消息框出现在前一个消息框关闭之前。

我的第一个想法是将 SyncLock 放在 Update() 中,这样它就永远不能同时运行,但它没有效果。当我在 MessageBox 中输出 .ManagedThreadID 时,所有调用都具有相同的线程 ID,因此 SyncLock 不起作用似乎是合乎逻辑的,因为它只会阻塞不同的线程。

那么有人可以解释这里发生了什么吗?单个线程如何同时执行相同的功能?

0 投票
1 回答
289 浏览

android - 有什么办法可以同步我的avd的时钟

我正在使用 android 虚拟设备进行 android 开发,我正在开发一个应用程序来更新 twitter 中的状态并看到 logcat 我认为问题是它的系统时钟不同步,任何人都可以帮忙。

日志猫

完整的代码在这里

0 投票
1 回答
264 浏览

multithreading - 我是否需要线程锁定值类型(特别是布尔值)

我知道我不能在值类型上使用锁 (SyncLock),如本文所述:

http://msdn.microsoft.com/msdnmag/issues/03/01/NET/

但我的问题是,这是否意味着我不需要?还是我需要将布尔值包装在一个对象中,以便可以锁定它?如果答案是否定的,我不需要锁定它,当两个线程尝试同时更改值时会发生什么?在我目前正在处理的应用程序中,两个线程可能会尝试同时将其设置为 true 和 false。

0 投票
2 回答
83 浏览

.net - 如何以最佳方式实现对特定数据部分的访问排队的锁定?

我的 ASP.NET 应用程序提供对各种数据块的访问。每个块都可以被一个或多个用户同时访问,因此应用程序必须防止冲突。

经过大量考虑,我认为乐观并发不是这种情况的最佳解决方案,目前将锁定视为一个合适的选择。

我可以很容易地让所有请求一个一个地处理SyncLock,如下所示:

私有共享访问锁作为新对象

但这极大地限制了应用程序的可扩展性。

因此,我正在考虑以某种方式仅对特定数据部分的访问进行排队。例如,一个队列用于访问数据的一部分,而另一个队列用于访问另一部分数据。

有没有办法自定义同步锁定以对数据的不同部分使用不同的队列,而不是对所有内容仅使用 1 个队列?我的意思是它可以让我手动指定诸如“SyncLock ("Group1") 和 "SyncLock ("Group2") 之类的东西。

0 投票
1 回答
1799 浏览

.net - 如何同步锁定共享整数

一般来说,我对多线程很陌生,我想知道如何锁定共享整数变量,使其在被其他线程读取/更新时不被其他线程访问。

当我尝试 do do 时SyncLock myInteger,我收到该错误:错误 6 'SyncLock' 操作数不能属于 'Integer' 类型,因为 'Integer' 不是引用类型。

这是我的意思的简化示例

MySub 由类的多个实例调用,并在多个线程中运行

0 投票
4 回答
6517 浏览

vb.net - VB.net SyncLock 对象

我总是在人们使用的 SyncLock 示例中看到

但为什么?在我的具体情况下,我锁定了一个队列以避免多线程入队和出队我的数据出现问题。

我可以像这样锁定 Queue 对象本身吗?

任何帮助表示赞赏。谢谢。

编辑:

感谢所有答案,但 tcarvin 答案是我正在寻找的。该队列对于我的单例 Comms 对象是私有的,该对象对要发送的新消息进行排队(由 Send 方法公开),该队列在该对象内的工作线程中一次一条消息被使用,并且我在锁中拥有的唯一代码是一次调用 Enqueue 和 Dequeue。

0 投票
1 回答
421 浏览

vb.net - 我应该在锁定列表之前和之后仔细检查吗?

我有一个应用程序内服务,它允许我向它提供来自各种来源的消息,这些消息将被放入一个简单的列表中。该服务在自己的线程中运行,将定期将列表中的所有消息处理成各种文件;每个源一个文件,然后对其大小进行管理。

我的问题是关于检查消息和对访问列表的代码执行锁定的正确方法。只有两个地方可以访问该列表;一种是将消息添加到列表的位置,另一种是将消息从列表转储到处理列表中的位置。

将消息添加到列表:

处理列表:

我的问题是:我在处理列表时是否应该仔细检查,见下文?为什么?或者为什么不呢?在锁之外访问列表的计数属性是否有任何危险?哪种方法更好或更有效?为什么?或者为什么不呢?

我知道在这种特殊情况下,考虑到在处理功能之外,列表只能增长这一事实,我是否进行仔细检查可能并不重要。但这是我的工作示例,我正在尝试了解线程的更详细信息。

提前感谢您的任何见解......</p>


经过一些进一步的研究,谢谢'浣熊',以及一些实验性编程,我有一些进一步的想法。

关于ReaderWriterLockSlim,我有以下示例,它似乎工作正常。它允许我读取列表中的消息数量,而不会干扰可能试图读取列表中消息数量或消息本身的其他代码。当我想要处理列表时,我可以将我的锁升级为写入模式,将消息转储到处理列表中并在任何读/写锁之外处理它们,因此不会阻塞任何其他可能想要添加或读取的线程, 更多消息。

请注意,这个例子使用了一个更简单的消息结构,一个字符串,而不是前面的例子,它使用了一个类型和一些其他元数据。

我看到这种技术的唯一问题是开发人员必须勤于获取和释放锁。否则会发生死锁。

至于这是否比使用SyncLock更有效,我真的不能说。对于这个特定的示例及其用法,我相信任何一个都足够了。由于“浣熊侠”给出的关于在其他人更改计数时读取计数的原因,我不会进行双重检查。鉴于此示例,SyncLock将提供相同的功能。然而,在一个稍微复杂一点的系统中,一个可能有多个源读取和写入列表的系统,ReaderWriterLockSlim将是理想的。


关于BlockingCollection列表,以下示例与上述示例类似。

Simplicity itself…</p>

0 投票
2 回答
375 浏览

.net - 多线程中列表上的 SyncLock 仍然抛出 ArgumentException

我需要从(后台)线程上的列表中读取,而它可能会从另一个(主线程)更新。因此,我尝试仅制作一个临时列表以不访问原始对象。由于更新可能发生在多个位置,因此将 SyncLock 放在读取逻辑上会很方便。这本身就是错误的吗?我有哪些选项可以正确锁定它,或者以其他方式在多线程条件下获取列表的可访问副本?

SomeList.ToList抛出:

ArgumentException,目标数组不够长。检查 destIndex 和长度,以及数组的下限。

0 投票
1 回答
801 浏览

.net - SyncLock 是可重复的吗?

我在一个管理自动刷新某些对象的类中有以下代码,它还允许您手动刷新。我想让它成为线程安全的。

我很想使用Synclock这两种方法:

  • ForceRefresh:所以我们不会让多个消费者线程同时尝试强制刷新和重置计时器
  • DoRefreshGetTheFoo(): 所以如果我们已经在尝试检索一个,我们就不会尝试。我正在使用System.Threading.Timerwhich 可能会回调任何ThreadPool线程,因此仅使用标志可能不合适(但也许仍然有必要?)

... 像这样:

但是后来我最终在调用时尝试了Synclock两次_syncRoot......ForceRefresh现在如果Synclock是可重入的,那么嵌套这些将不是问题。MSDN文档页面似乎暗示是这种情况,但没有明确说明。

注意:我会自己尝试一下,但我在 StackOverflow 上没有看到任何关于此的内容,并认为这是一个有用的问题需要回答。