问题标签 [race-condition]

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 投票
5 回答
5675 浏览

multithreading - 是否可以在不使用偏移量的情况下将指针存储在共享内存中?

当使用共享内存时,每个进程可以将共享区域映射到其各自地址空间的不同区域。这意味着当在共享区域中存储指针时,您需要将它们存储为共享区域开始的偏移量。不幸的是,这使原子指令的使用变得复杂(例如,如果您正在尝试编写无锁算法)。例如,假设您在共享内存中有一堆引用计数节点,由单个作者创建。编写器定期自动更新指针“p”以指向具有正引用计数的有效节点。读者希望以原子方式写入“p”,因为它指向一个节点(结构)的开头,该节点的第一个元素是引用计数。由于 p 总是指向一个有效的节点,增加 ref 计数是安全的,并且可以安全地取消引用 'p' 并访问其他成员。然而,这一切只有在所有东西都在同一个地址空间中时才有效。如果节点和“p”指针存储在共享内存中,则客户端会遇到竞争条件:

  1. x = 读取 p
  2. y = x + 偏移量
  3. 在 y 处增加引用计数

在第 2 步期间,p 可能会发生变化,并且 x 可能不再指向有效节点。我能想到的唯一解决方法是以某种方式强制所有进程就映射共享内存的位置达成一致,以便可以将真正的指针而不是偏移量存储在 mmap'd 区域中。有没有办法做到这一点?我在 mmap 文档中看到 MAP_FIXED,但我不知道如何选择一个安全的地址。

编辑:在 x86 上使用内联汇编和“锁定”前缀也许可以构建一个“增量 ptr X,偏移量 Y 值 Z”?其他架构上的等效选项?没有写很多汇编,不知道有没有需要的指令。

0 投票
2 回答
856 浏览

c# - 从c#中的线程子类化窗口

我正在创建一个寻找窗口的线程。当它找到窗口时,它会覆盖它的 windowproc,并处理 WM_COMMAND 和 WM_CLOSE。

这是查找窗口并将其子类化的代码:

和windowproc:

这一切都在正常条件下运作良好。但是我看到了两个不良行为的例子,按不良顺序排列:

  1. 如果我在一分钟左右没有关闭对话框,应用程序就会崩溃。这是因为线程正在收集垃圾吗?就 GC 可以告诉线程已完成而言,这有点道理?如果是这种情况,(我不知道是这样),只要对话框还在,我怎样才能让线程一直存在?

  2. 如果我立即使用“X”按钮 (WM_CLOSE) 关闭对话框,应用程序就会崩溃。我相信它在 windowproc 中崩溃了,但我无法在其中找到断点。我收到 AccessViolationException,异常显示“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。” 这是一个比赛条件,但我不知道。仅供参考,一旦我处理了命令,我就一直在重置旧的 windowproc,但这更频繁地崩溃!

关于如何解决这些问题的任何想法?

0 投票
2 回答
698 浏览

iphone - NSNotification race condition

Are there any race condition issues when using NSNotifications within a single thread? Here is a sample method:

}

The first two calls after the condition will trigger NSNotifications that will be received by mainPane. Is mainPane guaranteed to receive the playerToggled message after those notifications? I should say that this code seems to work as desired (playerToggled always executes last). But I'm not sure what timing issues there are around notifications and I can't find a specific answer.

0 投票
1 回答
2032 浏览

.net-4.0 - 我应该如何处理这个实体框架代码中的这个乐观并发错误,我有?

我在一些使用EF4的存储库模式项目中有以下伪代码。

很简单,但我遇到了运行时错误:-

ConcurrencyException:存储、更新、插入或删除语句影响了意外的行数 (0)。

现在,这就是正在发生的事情:-

  1. EF4 的两个实例同时在应用程序中运行。
  2. 实例 A 调用删除。
  3. 实例 B 在一纳秒后调用 delete。
  4. 实例 A 加载实体。
  5. 实例 B 还加载实体。
  6. 实例 A 现在删除了该实体 - 酷香蕉。
  7. 实例 B 尝试删除实体,但它已经消失了。因此,当它期望 1 .. 或类似的东西时,无计数或什么不是 0。基本上,它发现它应该删除的项目没有删除(因为它发生在几秒钟前)。

我不确定这是否像比赛条件或其他东西。

无论如何,我可以在这里做些什么让第二次通话不会崩溃?我可以把它变成一个存储过程..但我希望现在避免这种情况。

有任何想法吗?我想知道是否可以在调用 select 时锁定该行(并且仅该行)......强制实例 B 等待行锁被释放。到那时,该行已被删除,因此当实例 B 选择时,数据不存在.. 所以它永远不会删除。

0 投票
2 回答
2167 浏览

c# - 如何用监视器替换此信号量?

在我之前的问题中,有人说在 C# 中使用信号量比使用监视器要昂贵。所以我问这个,如何用监视器替换这段代码中的信号量?

在function2(在单独的线程中)完成后,我需要function1返回它的值。我已经Semaphore.WaitOne用 aMonitor.Wait和a 替换了Semaphore.Releasea ,Monitor.PulseAll但是在导致程序挂起PulseAll之前被触发了。Wait知道如何避免这种竞争条件吗?

0 投票
3 回答
3955 浏览

php - 如何保护 PHP 中的关键部分?

我对这个主题进行了一些搜索,但没有发现任何有价值的东西。

如果我不使用 PHP 默认会话处理程序,则请求级别没有会话锁定。所以,我必须自己保护关键部分。

在 Java 中,我们已经同步了. 在 C# 中,我们有lock

在 PHP 中,如何做到这一点?

0 投票
1 回答
730 浏览

c# - Monitor.Wait/Pulse 的这种使用是否存在竞争条件?

我有一个简单的生产者/消费者场景,其中只有一个项目正在生产/消费。此外,生产者在继续之前等待工作线程完成。我意识到这种方式消除了多线程的全部意义,但请假设它确实需要这样(:

这段代码无法编译,但我希望你能明白:

这是我不确定的情况:

假设许多线程使用不同的输入调用 SetData()。其中只有一个会进入锁内,其余的将在 A 行被阻塞。假设进入锁内的那个设置m_data并进入 C 行。

问题:C 行上的 Wait() 是否允许 A 行上的另一个线程在工作线程到达之前获得锁并覆盖m_data ?

假设这没有发生,并且工作线程处理原始m_data并最终到达 F 行,那么当 Pulse() 关闭时会发生什么?

只有在 C 行等待的线程才能获得锁吗?或者它是否会与在线 A 上等待的所有其他线程竞争?

本质上,我想知道 Pulse()/Wait() 是否特别“在后台”相互通信,或者它们是否与 lock() 处于同一级别。

这些问题的解决方案(如果存在)当然是显而易见的——只需用另一个锁包围 SetData()——比如 lock(y)。我只是好奇这是否甚至是一个问题。

0 投票
1 回答
1256 浏览

c# - MSDN 处理 TPL 异常的示例 - 这是竞争条件吗?

我正在查看来自 MSDN @ 的 TPL 异常处理示例

http://msdn.microsoft.com/en-us/library/dd537614(v=VS.100).aspx

代码的基本形式是:

我的问题是:这是竞争条件吗?如果 task1 在 try 执行之前抛出会发生什么?我是否错过了阻止这场比赛的东西?

不应该这样写吗:

0 投票
3 回答
4376 浏览

multithreading - 多线程阅读中的竞争条件如何?

根据 IBM.com 上的一篇文章,“竞争条件是两个或多个线程或进程正在读取或写入某些共享数据的情况,最终结果取决于线程如何调度的时间。竞争条件可以导致不可预测的结果和微妙的程序错误。” . 虽然这篇文章是关于 Java 的,但我通常被教导相同的定义。

据我所知,从 RAM 读取的简单操作包括设置特定输入线的状态(地址、读取等)和读取输出线的状态。这是一个显然不能由两个设备同时执行的操作,必须串行化。

现在让我们假设我们有几个线程访问内存中的对象的情况。理论上,这种访问应该被序列化以防止竞争条件。但是例如读取器/写入器算法假设任意数量的读取器可以同时使用共享内存。

所以,问题是:在使用多线程(例如在 WinAPI 中)时,是否必须为读取实现排他锁?如果不是,为什么?这个控制在哪里实现——操作系统、硬件?

最好的问候,库巴

0 投票
7 回答
3212 浏览

c++ - 如何在不使用 C++ 锁的情况下防止竞争条件?

如何在没有锁定或在 C++ 中使用互斥体/信号量的情况下防止竞争条件?我正在处理一个嵌套的 for 循环,在该循环中我将在数组中设置一个值:

或多或少,我想处理这个问题,以便我可以确保同时运行的不同线程不会同时写入 array[k]。关于如何解决这个问题的任何建议?

编辑:我在 Linux 机器上运行,我还必须使用 Intel 编译器。我将使用“icc”而不是“gcc”来编译代码。