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

c# - 这是静态类和线程安全的坏习惯吗?

假设我没有使用 lock 语句,这是一种不好的做法吗?

编辑 -

在尝试了这样的事情之后,我意识到这有几个原因是不可行的。我只是好奇..我发布的示例甚至不起作用。

0 投票
4 回答
12114 浏览

ruby-on-rails - Ruby/Rails 线程安全

我不时地使用 Ruby 进行黑客攻击,但我没有用它做任何大的或多线程的事情。我听说 MRI 只支持绿色线程,而 JRuby 通过 JVM 支持本机线程。然而,我偶然发现博客和讨论组上的评论说“Rails 不是线程安全的”或者 Ruby 本身不是线程安全的。例如,有人评论说 require 语句有问题。这听起来有点基本。

我见过很多不能正确处理并发的 Java 应用程序,我不时对它们做噩梦 :-) 但是,如果你真的知道自己在做什么,至少你可以用 Java 编写线程安全的应用程序(它是只是不容易)。

这一切听起来都令人震惊,有人可以详细说明一下 - 究竟是什么问题,如果是这种情况,Rails 是如何工作的?我可以编写在没有竞争条件和死锁的情况下正常工作的多线程 Ruby 代码吗?它在 JRuby 和 MRI 之间是可移植的,还是我必须破解 JVM 特定代码才能正确利用 JVM 本机线程?

编辑:

我应该问两个问题,因为人们似乎只回答 Rails 线程的东西(这本身很好)和绿色线程与原生线程。我对关于线程安全的核心 Ruby 问题的担忧并没有真正得到解决。在某些情况下,require似乎至少存在一个(未解决的?)问题。

0 投票
1 回答
1111 浏览

multithreading - 在多线程 Windows http 服务器中运行非线程安全的 dll

我需要将 VB6 应用程序封装为将由 IIS 调用的 COM 对象。VB6 应用程序使用的其中一个 dll 不是线程安全的。

如何确保每当调用我的 COM 对象时它不会与自身的其他实例共享相同的 dll?

我在某处读到 ActiveX exe 在不同的进程中运行每个实例,这就足够了吗?

0 投票
4 回答
11222 浏览

linux - 如何在 Linux 上实现线程安全定时器?

众所周知,在信号处理程序中做事真的很糟糕,因为它们在类似中断的上下文中运行。调用信号处理程序时,很可能会持有各种锁(包括 malloc() 堆锁!)。

所以我想在不使用信号机制的情况下实现一个线程安全的计时器。

我能怎么做?

抱歉,实际上,我并不期待有关线程安全的答案,而是有关在 Unix 或 Linux 上实现线程安全的计时器的答案。

0 投票
2 回答
135 浏览

java - EventActionDispatcher 可以在构造函数完成之前发布“this”吗?

使用 EventActionDispatcher 的推荐方法如下(根据 API 文档 @ http://struts.apache.org/1.2.9/api/org/apache/struts/actions/EventActionDispatcher.html

这样做会在构造函数退出之前发布对“this”的引用吗?管理方法之外的字段分配的规则是什么。

提前致谢。

真诚的,LES

0 投票
2 回答
8192 浏览

c# - .NET ref 参数是线程安全的,还是容易受到不安全的多线程访问?

简介编辑:
我们知道 C# 中的 ref 参数传递对变量的引用,允许在调用的方法中更改外部变量本身。但是引用是否像 C 指针那样处理(每次访问该参数时读取原始变量的当前内容,并在每次修改参数时更改原始变量),或者被调用的方法是否可以依赖于一致的引用通话时长?前者带来了一些线程安全问题。尤其:

我在 C# 中编写了一个静态方法,它通过引用传递一个对象:

调用者提供了一个已完成但尚未注册的Definition对象,经过一些一致性检查后,我们“注册”了他们提供的定义。但是,如果已经存在具有相同键的定义,则无法注册新键,而是将其引用更新Definition为该键的“官方”。

我们希望这是严格线程安全的,但我想到了一个病态的场景。假设客户端(使用我们的库)以非线程安全的方式共享引用,例如使用静态成员而不是局部变量:

如果一个线程设置riskyReference = new Definition("key 1");、填写定义并调用我们Definition.Register(ref riskyReference);,而另一个线程也决定设置riskyReference = new Definition("key 2");,我们是否保证在我们的 Register 方法中,newDefinition我们正在处理的引用不会被其他线程修改(因为对对象被复制进来并在我们返回时被复制出来?),或者其他线程可以在执行过程中替换我们身上的对象(如果我们引用指向原始存储位置的指针???),因此打破我们的健全性检查?

请注意,这与对底层对象本身的更改不同,这对于引用类型(类)当然是可能的,但可以通过该类中的适当锁定来轻松防止。但是,我们不能保护对外部客户端变量空间本身的更改!我们必须在方法顶部制作自己的参数副本并覆盖底部的参数(例如),但考虑到处理不安全的参考。

所以,我倾向于认为引用可能会被编译器复制进和复制出,以便该方法处理对原始对象的一致引用(直到它在需要时更改自己的引用),无论可能发生什么发生在其他线程上的原始位置。但是,在文档和 ref 参数的讨论中,我们很难找到关于这一点的明确答案。

任何人都可以通过明确的引用来缓解我的担忧吗?

Edit for conclusion:
Having confirmed it with a multi-threaded code example (Thanks Marc!) and thinking about it further, it makes sense that it is indeed the not-automatically-threadsafe behavior which I was worred about. One point of "ref" is to pass large structs by reference rather than copy them. Another reason is that you might want to set up a long-term monitoring of a variable and need to pass a reference to it which will see changes to the variable (eg. changing between null and a live object), which an automatic copy-in/copy-out would not allow for.

So, to make our Register method robust against client insanity, we could implement it like:

They'd still have their own threading issues as far as what they end up getting, but at least their insanity wouldn't break our own sanity-checking process and possibly slip a bad state past our checks.

0 投票
3 回答
289 浏览

c# - 是否可以发布取自 .net 框架并在线修改的代码?

我使用反射器查看通用字典集合 (Dictionary<TKey, TValue>) 的代码并修改该代码以使其线程安全。我想在我的博客上发布这段代码,以便其他人可以查看它(如果我做错了什么,请告诉我),如果他们愿意,也可以在他们的项目中使用它。从法律上讲,我可以这样做吗?我大量修改了原始代码(并且只从原始代码中获取了一些方法,而不是全部)但基本代码仍然相同,如果我这样做会不会有任何潜在的法律问题?

注意:以防万一有人指向我线程安全字典的实现,我知道已经有使用 ReaderWriterLockSlim 的线程安全字典的实现,但我不希望在读取时(仅在写入时)进行任何锁定,除了我'我使用 .net 2.0 而不是 3.5,所以无论如何我都不能使用 ReaderWriterLockSlim,而且我在某处读到 ReaderWriterLock 在 2.0 中的性能非常差,所以我不想使用它。

0 投票
3 回答
39425 浏览

php - PHP 线程安全吗?

  • PHP(从 5.2 开始)在 Linux/UNIX 上是线程安全的吗?
  • 是否可以将它与 Apache Worker-MPM 或 Event-MPM 一起使用?

到目前为止,我收集的事实尚无定论:

  • 大多数发行版中包含的默认二进制文件都禁用了 ZTS,所以我知道,我必须重新编译它们。
  • 理论上,启用 ZTS 的 Zend Engine(核心 PHP)是线程安全的。
  • 据说有些模块可能不是线程安全的,但我没有找到任何模块列表是或不是。
  • PHP FAQ状态与上面几乎相同。

你有什么经验?

这不仅仅是分段错误(Windows 命名法中的“访问冲突”)。线程安全还有很多。

0 投票
2 回答
245 浏览

concurrency - 检测并发问题的工具

我看到了一个工具,它可以告诉您项目中是否存在设计问题,我想知道是否有一个工具可以动态地告诉您项目中是否存在一些并发问题。

0 投票
5 回答
23772 浏览

c++ - 是提升 shared_ptr线程安全吗?

我有一个关于boost::shared_ptr<T>.

有很多线程。

第一季度

如果Thread_A不关心nowResource是最新的,这部分代码会有问题吗?

我的意思是当Thread_BSetResource()完全时,Thread_A得到一个错误的智能点GetResource()

第二季度

线程安全是什么意思?

如果我不关心资源是否是最新shared_ptr<CResource> nowResource的,释放时程序会崩溃nowResource还是问题会破坏shared_ptr<CResource>