问题标签 [thread-safety]

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 投票
10 回答
922 浏览

c++ - 在某些东西本身变得线程安全之前,您要走多低?

我一直在想,在某些东西自动成为线程安全之前,你必须深入到什么程度?

快速示例:

.. 这种方法会被认为是线程安全的吗?我通常将我所有的 set-methods 包装在互斥体中,只是为了确定,但每次我这样做时,我不禁认为这是一种无用的性能开销。我想这一切都分解为编译器生成的程序集?线程什么时候能够闯入代码?每个汇编指令或每个代码行?线程可以在方法堆栈的设置或销毁期间中断吗?像 i++ 这样的指令会被认为是线程安全的吗?如果不是,那么 ++i 呢?

这里有很多问题-我不希望直接回答,但是有关该主题的一些信息会很棒:)

[更新] 因为我现在很清楚(谢谢你们 <3),线程中唯一保证原子的东西是汇编指令,我知道我开始思考:互斥锁和信号量包装类呢?像这样的类通常使用制作调用堆栈的方法 - 并且通常使用某种内部计数器的自定义信号量类不能保证是原子/线程安全的(无论你想怎么称呼它,只要你知道我的意思,我不在乎: )

0 投票
8 回答
48130 浏览

c# - 有哪些替代方法可以暂停和恢复线程?

从 .NET 2.0 开始Thread.Suspend(),这两种方法都已过时。Thread.Resume()为什么?还有哪些其他选择和示例?

0 投票
3 回答
11071 浏览

c++ - 如何从 MFC 中的线程更改状态栏的窗格文本?

我在 MFC 中有一个带有 CStatusBar 的对话框。在一个单独的线程中,我想更改状态栏的窗格文本。然而 MFC 抱怨断言?它是如何完成的?一个示例代码会很棒。

0 投票
5 回答
2865 浏览

.net - .NET System.Net.CookieContainer 线程安全吗?

  1. .NET 类 System.Net.CookieContainer 线程安全吗?--更新:交钥匙回答--
  2. 有什么方法可以确保在异步请求期间修改的变量(即 HttpWebRequest.CookieContainer)的线程安全性?
  3. 是否有任何属性可以突出线程安全类?--更新:如果 MSDN 上描述了线程安全,那么他们可能没有这个属性 --
  4. 所有 .NET 类都是线程安全的吗?--更新:马克回答了--

我问这些问题是因为我在多线程代码的异步请求中使用了 CookieContainer。而且我不能将异步请求放入锁中。也许我必须像在 F# 中那样使用只读“变量”(或不可变类型),对吧?

0 投票
1 回答
126 浏览

.net - GAC 包含的程序集中共享的处理

我知道在创建 DLL 并将项目声明为“共享”(C# 中的静态)时,它们在第一次调用时被实例化,然后该对象引用作为单个引用继续存在。

因此,一旦设置了共享字符串属性,就可以再次调用以检索相同的值。然后,线程安全是应用程序域中的一个主要问题。

在应用程序域之外会发生什么。如果我们将程序集放在全局应用程序缓存 (GAC) 中,将存在多少个实例?

例如,GAC'ed .dll 中名为“MyFileName”的静态属性。

然后我们有两个应用程序调用 GAC 的 .dll。将存在多少个“MyFileName”实例?应用程序一对 MyFileName 的更改是否会复制到应用程序二使用的值?

0 投票
5 回答
22201 浏览

java - 在 Java 中单元测试线程安全的任何令人满意的方法?

我正在考虑改进一个包,当它的输入在多个工作线程之间共享时,我认为它不是线程安全的。根据 TDD 原则,我应该编写一些一开始就失败的测试,这些测试肯定对评估问题很有用。

我意识到这不是一件容易实现的事情,而且天真地,多线程测试将是不确定的,因为操作系统将确定调度和各种操作交错的确切顺序。我过去看过并使用过MultithreadedTC,这很有用。然而,在那种情况下,我提前知道现有实现在哪里失败,因此能够编写一组很好的测试来覆盖它。

但是,如果您还没有确切地知道问题出在哪里,是否有一种很好的方法可以编写一个很有可能引发任何潜在问题的测试?是否有其他人发现有帮助的库?我认为从纯粹主义者的角度来看,多线程测试用例应该与通常的单线程测试相同的调用和断言是正确的吗,只在适当的情况下使用多个工作线程运行?

任何关于工具/最佳实践/哲学的提议都将受到欢迎。

0 投票
2 回答
1985 浏览

c# - C# treeview 线程安全操作

我正在寻找有关以安全线程方式使用树视图的信息。有没有人有这方面的经验或知道一些在线研究链接。

谢谢

0 投票
9 回答
18189 浏览

c++ - 完全线程安全的 shared_ptr 实现

有人知道完全线程安全的shared_ptr实现吗?例如 boost 的实现shared_ptr对于目标(引用计数)是线程安全的,并且对于同时shared_ptr实例读取也是安全的,但对于写入或读/写则不是。

(参见Boost 文档,示例 3、4 和 5)。

shared_ptr是否存在对实例完全线程安全的 shared_ptr 实现?

奇怪的是 boost 文档说:

shared_ptr 对象提供与内置类型相同级别的线程安全。

但是,如果将普通指针(内置类型)与 进行比较smart_ptr,则同时写入普通指针是线程安全的,但同时写入 asmart_ptr则不是。

编辑:我的意思是 x86 架构上的无锁实现。

EDIT2:这种智能指针的一个示例用例是有许多工作线程使用它们当前的工作项更新全局 shared_ptr 和一个对工作项进行随机采样的监视器线程。shared-ptr 将拥有该工作项,直到另一个工作项指针被分配给它(从而破坏先前的工作项)。监视器将通过将工作项分配给它自己的 shared-ptr 来获得工作项的所有权(从而防止工作项被销毁)。可以通过 XCHG 和手动删除来完成,但如果 shared-ptr 可以做到这一点会很好。

另一个例子是全局 shared-ptr 拥有一个“处理器”,并由某个线程分配,并由某个其他线程使用。当“用户”线程看到处理器 shard-ptr 为 NULL 时,它使用一些替代逻辑来进行处理。如果它不是 NULL,它会通过将处理器分配给它自己的 shared-ptr 来防止处理器被破坏。

0 投票
5 回答
384 浏览

performance - 将变量同时更新为相同值的线程安全

以下构造是否是线程安全的,假设 foo 的元素已正确对齐和调整大小以便没有单词撕裂?如果不是,为什么不呢?

注意:下面的代码是我想做的一个玩具示例,而不是我实际的现实世界场景。显然,在我的示例中,有更好的编码可观察行为的方法。

乍一看,这显然不安全,所以我将强调为什么我认为它可能是安全的:

  1. 仅有的两个选项是 foo 的元素保持不变或设置为 MAGIC_VAL。
  2. 如果线程二在更新时看到 foo[i] 处于中间状态,那么只会发生两件事:中间状态是 <SOME_OTHER_NUMBER或者不是。如果是 < SOME_OTHER_NUMBER,线程二也会尝试将其设置为 MAGIC_VAL。如果没有,线程二将什么也不做。

编辑:另外,如果 foo 是 long 或 double 什么的,那么更新它就不能自动完成?您仍然可以假设对齐等是这样的,即更新 foo 的一个元素不会影响任何其他元素。此外,在这种情况下,多线程的重点是性能,因此任何类型的锁定都会破坏这一点。

0 投票
9 回答
89685 浏览

c# - 使用 get/set 实现 C# 线程安全

这是 C# 的详细问题。

假设我有一个带有对象的类,并且该对象受锁保护:

我希望轮询线程能够查询该属性。我还希望线程偶尔更新该对象的属性,有时用户可以更新该属性,并且用户希望能够看到该属性。

以下代码会正确锁定数据吗?

'适当地',我的意思是,如果我想打电话

或者其他什么,在我进行更新时该字段会被锁定吗?是在“get”函数范围内由等于运算符完成的设置,还是“get”函数(以及锁定)首先完成,然后调用设置,然后调用“set”,从而绕过锁?

编辑:既然这显然不会奏效,那会怎样?我是否需要做类似的事情:

这或多或少只是确保我只能访问副本,这意味着如果我让两个线程同时调用“get”,它们每个都将以相同的 Field1 值开始(对吗?)。有没有办法对有意义的属性进行读写锁定?或者我应该限制自己锁定功能部分而不是数据本身?

只是为了让这个例子有意义:MyObject 是一个异步返回状态的设备驱动程序。我通过串行端口向它发送命令,然后设备在自己的甜蜜时间响应这些命令。现在,我有一个线程来轮询它的状态(“你还在那里吗?你能接受命令吗?”),一个等待串行端口响应的线程(“刚得到状态字符串 2,一切都很好” ),然后是接受其他命令的 UI 线程(“用户希望你做这件事。”)并发布来自驱动程序的响应(“我刚刚完成了这件事,现在用它更新 UI”)。这就是为什么我想锁定对象本身,而不是对象的字段;那将是大量的锁,a 和 b,并非此类的每个设备都具有相同的行为,