问题标签 [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.
wpf - 同步用户控件中多个属性的绑定
我有一个 WPF 用户控件的丑陋竞争条件,它是某种扩展的 ComboBox:UserControl 主要定义了两个可绑定的 DependencyProperties,一个是选定项,另一个是列表,可以从中选择选定项。两者都是可绑定的,因此可以使用或不使用选定项来初始化控件,并且可以通过绑定更改两个属性(在 DataContext 更改时),进一步的选择可能会由于用户交互而更改。UserControl 包含一个 ComboBox,其 ItemsSource 和 SelectedItem 与我的列表属性和 UserControl 的 SelectedItem 同步 - 到目前为止一切顺利。现在的问题是,如果在设置具有两个值的新 DataContext 时从外部(准同时)更改两个属性,
简而言之:我需要找到一种方法在列表更新期间“锁定”我的 SelectedItem - 但仅观察 PropertyChanged-Events 是不够的,因为我在更新后收到它们,而要记住的状态已经丢失。此外,我无法确定选择更改是由用户还是由(正确)绑定或(不希望)间接由其他绑定引起的......我想我需要一些 BeforePropertyChanged 或 OnPropertyChanging 事件用于我的 DependencyProperties - 或其他管理两个属性同时更新的顺序的方法。
欢迎任何建议:)
请注意,我说的是从中选择项目的列表,但实际上它是一些更复杂的结构,可以快速排序和过滤,这也是我在这里不使用 ItemsControl 的原因,但我不觉得那是与问题相关。
java - Java中同一对象的不同实例上的多线程
我了解到,每个类加载器都会将每个类字节码加载到内存中一次,因此当一个线程正在执行某个方法的字节码时,另一个线程会出现?
Foo类的1 个线程 -> 1 个实例 == 没问题。
X线程 -> 1 个实例 -类 Foo == 需要处理,这很清楚。
X个线程 -> X 个相应的实例 -类 Foo == ????
我应该确保方法中没有任何问题吗?如果该方法使用实例级变量,我可以确定它会使用正确的变量吗?
更新:
我看到我的问题有些人不清楚,这里有一个数字示例
我有一个Foo类类型的对象,它没有同步!!
我有该Foo的 5 个实例,每个实例中运行 5 个线程,并访问实例级参数,例如:
我问这里有没有问题,因为这个类只有1个字节码和这个对象的5个实例访问这个字节码,所以如果我想防止它们在同一个字节码上重叠,我应该怎么做做?
谢谢,亚当。
c# - 在 C# 中的多线程情况下使用队列
我刚刚了解了 .NET 中的队列,我有几个问题。
假设我正在构建一个应用程序来下载页面的 HTML,然后对其进行处理。这是我希望它的操作方式:
- 主线程将 URL 添加到队列
- 该队列由另外两个线程读取。他们“出列”一个 URL,然后下载相应的 HTML。
- 然后将 HTML 发送回主线程。
- 当 HTML 到达主线程时,它被放入另一个队列,由另外两个线程处理。这些线程处理 HTML。
- 处理结果返回到主线程。
如何在没有竞争条件的情况下实现这样的场景?
另外,如上所述在队列和线程之间传递信息的最佳方式是什么?
你能给我一些示例代码吗?
谢谢!
multithreading - 绕行条件和死锁之间的区别
在编程术语中,死锁和围绕条件的竞争有什么区别?
c++ - 寻找竞争条件的方法
我有一些带有竞态条件的代码......我知道这是一个竞态条件,因为它不会始终如一地发生,而且它似乎更频繁地发生在双核机器上。
当我追踪时,它永远不会发生。虽然,它也有可能是一个僵局。通过分析日志的完成阶段,我已经能够将这个错误定位到单个函数。但是,我不知道这是在函数范围内发生的。它不在顶层。
如果是竞态条件,添加日志语句或断点将改变时间,并防止这种情况发生。
除了获得一个可以让我查明发生这种情况的竞争条件分析器之外,我还可以使用任何技术吗?
这是在 Visual Studio 9 中,使用 C++(非托管品种)。
silverlight - Techniques for debugging a race condition in Silverlight
I've hit against what I think is a race condition. What options do I have to debug it?
More details: I have a Silverlight application which uses Telerik grid. The columns can be customised by the user by using a column chooser attached to the grid. In a particular case where the list of possible columns are created via the code, when I open the column chooser and close it, the data in the grid (all the rows) disappear!
Symptoms that I see which lead me to believe it is a race condition: - If I put a break point at the columnchooser.close line, and when the break point is hit, just continue, the bug is not visible (all the gird rows remain visible) - If I put a Thread.Sleep(1000) in the code just before columnchooser.close, again the bug disappears - If I keep the "Threads" window in Visual Studio open while debugging, I see a thread momentarily appear and disappear in the Threads window just as I hit the breakpoint at columnchooser.close
So, I tried the following to figure out which threads are running at that point in time - but no joy:
- System.Diagnostics.Process is not available in Silverlight, so I can't do System.Diagnostics.Process.Threads to get a list of the threads running programmatically.
- I tried a break point with a "When hit" run Macros.Samples.VSDebugger.DumpStacks, but I couldn't figure out where it was dumping all the stack traces to.
Any help or ideas on what I can do to debug this issue?
c++ - c++ 虚拟调用 w/ vtable 实现中的多线程竞争条件的怀疑
我怀疑在某些 C++ 多线程情况下可能存在竞争条件,涉及 vtable 动态调度实现中的虚拟方法调用(为此,vtable 指针作为隐藏成员存储在具有虚拟方法的对象中)。我想确认这是否真的是一个问题,并且我指定了 boost 的线程库,以便我们可以假设一些参考框架。
假设一个对象“O”有一个 boost::mutex 成员,它的整个构造函数/析构函数和方法都被范围锁定(类似于 Monitor 并发模式)。线程“A”在没有外部同步的情况下在堆上构造对象“O”(即没有包含“新”操作的共享互斥锁,它可以与其他线程同步;但请注意,仍然存在“内部,Monitor”互斥锁其构造函数的作用域)。然后,线程 A 通过同步机制将指向“O”实例(它刚刚构建)的指针传递给另一个线程“B”——例如,同步的读写器队列(注意:只有指向对象正在被传递——而不是对象本身)。施工后,
线程“B”从同步队列中读取对象“O”的指针值,然后立即离开保护队列的临界区。然后线程“B”对对象“O”执行虚方法调用。这是我认为可能出现问题的地方。
现在,我对动态调度的[很可能的] vtable 实现中的虚拟方法调用的理解是,调用线程“B”必须取消引用指向“O”的指针,以便获得存储为其对象的隐藏成员的 vtable 指针,并且这发生在进入方法体之前(自然是因为在访问存储在对象本身中的 vtable 指针之前,要执行的方法体不能安全准确地确定)。假设上述陈述对于这样的实现可能是正确的,这不是竞争条件吗?
由于在任何内存可见性保证操作发生之前(即获取对象“O”中的成员变量mutex),线程“B”(通过解除指向位于堆中的对象“O”的指针)检索vtable指针,那么不确定“B”会感知“A”最初写在对象“O”的构造上的vtable指针值,对吗?(即,它可能会感知到垃圾值,从而导致未定义的行为,对吗?)。
如果上述是有效的可能性,这是否意味着对线程之间共享的专有内部同步对象进行虚拟方法调用是未定义的行为?
而且——同样——由于标准对 vtable 实现是不可知的,如何保证 vtable 指针在虚拟调用之前对其他线程安全可见?我想人们可以在外部同步(“外部”,例如,“围绕共享互斥锁()/解锁()块”)构造函数调用,然后至少在每个线程中进行初始虚拟方法调用,但这似乎是一些非常不和谐的编程。
所以,如果我的怀疑是真的,那么一个可能更优雅的解决方案是使用内联的非虚拟成员函数来锁定成员互斥体,然后转发到虚拟调用。但是——即使那样——我们能否保证构造函数在 lock() 和 unlock() 的范围内初始化了 vtable 指针来保护构造函数本身?
如果有人可以帮助我澄清这一点并确认/否认我的怀疑,我将不胜感激。
编辑:演示以上内容的代码
-- 在第 (4) 点,我的印象是“线程 A”写入内存的 vtable 指针值可能对“线程 B”不可见,因为我看不出有任何理由假设编译器会生成代码,以便将 vtable 指针写入构造函数的锁定互斥块中。
例如,考虑多核系统的情况,其中每个内核都有一个专用缓存。根据这篇文章,缓存通常是积极优化的,并且——尽管强制缓存一致性——如果不涉及同步原语,则不会对缓存一致性强制执行严格的排序。
也许我误解了这篇文章的含义,但这并不意味着“A”将 vtable 指针写入构造对象(并且没有迹象表明这种写入发生在构造函数的锁定互斥块中)可能在“B”读取 vtable 指针之前不会被“B”感知?如果 A 和 B 都在不同的内核上执行(“A”在 core0 上,“B”在 core1 上),缓存一致性机制可能会重新排序 core1 缓存中 vtable 指针值的更新(使其一致的更新与 core0 的缓存中的 vtable 指针的值,“A”写)这样它发生在“B”的读取之后......如果我正确解释了这篇文章。
javascript - Jquery Ajax 图像加载仅适用于 FF。怀疑“竞争条件”。
我制作了一个使用 jquery、ajax 和 json 加载图像的网络应用程序。我让它在 Firefox 中工作,但是 Safari 和 Chrome 仍然很顽固。
它与图像加载速度不够快的“竞争条件”有关,因此我有一个加载事件和一个触发事件,等待所有图像都加载完毕,然后再将 html 附加到容器 div。
这是在 FF 中工作的页面的链接:http: //chereecheree.com/dagworthy/style.html
还有一些代码: var aSectionImages = new Array;
} 但最好在网上看一下,因为有一个插件使用。无论如何,容器 div 的计算样式有时会显示为“0px”,这就是为什么我将其强制为“1000px”,但该 hack 不是很稳定。
任何想法将不胜感激。谢谢!——丹尼尔。
html - 设置 onmessage 处理程序时与网络工作者的竞争条件?
请考虑以下代码和本 Mozilla 教程“使用网络工作者”中的解释:
此示例中的第 1 行创建并开始运行工作线程。 第 2 行将 worker 的 onmessage 处理程序设置为一个函数,该函数在 worker 调用自己的 postMessage() 函数时调用。
线程在调用Worker构造函数的那一刻启动。我想知道设置onmessage处理程序是否可能存在竞争条件。例如,如果网络工作者在设置onmessage之前发布了一条消息。
有人知道更多吗?
更新:
Andrey 指出网络工作者应该在收到消息时开始工作,就像在 Mozilla 教程中的斐波那契示例中一样。但这不会在 web worker 中设置 onmessage 处理程序时创建一个新的竞争条件吗?
例如:
主脚本:
网络工作者脚本('worker.js')
然后考虑如下执行路径:
“ var result = [] ”行可以省略,它仍然是相同的效果。
这是一个有效的执行路径,我通过在 web worker 中设置超时来尝试它!目前我看不到,如何在不遇到竞争条件的情况下使用网络工作者?!
javascript - AJAX GET 比赛条件?
我正在尝试以类似于以下的方法在我的网站上单击链接时跟踪事件。
我遇到的问题是新页面加载中断了 AJAX 请求,因此有时这些事件没有被跟踪。我知道 Google Analytics 有一个_trackPageview
可以附加到 onclick 事件的功能,这似乎不是问题。我想知道他们的电话与我的电话有什么不同,我看到了这种比赛条件,而 GA 没有。例如:
请注意,我并不担心 AJAX 请求的结果......我只是希望它通过事件发生的事实来 ping 服务器。
(另外,我希望我会得到至少一个答案,说只是从服务器端而不是客户端跟踪新页面加载。这不是这个问题的可接受答案。我正在寻找类似的东西trackPageview
无论是否加载新页面,Google Analytics 的功能都适用于锚标记的点击事件。)