问题标签 [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.
c++ - 此多线程用例的最佳数据结构:侵入式列表好吗?
我需要设计一个支持以下操作的数据结构:
- 基于作为间隔的键在数据结构中搜索元素。例如,区间 1-5 内的值可能是 3,区间 6-11 内的值可能是 5,依此类推。间隔是连续的,它们之间没有重叠。
- 查找上一个和下一个间隔 - 这几乎与搜索间隔一样频繁。
- 分割区间,加入连续区间
- 并发性:我已将设计限制为一个编写器线程和其他读取器线程,如下所示。编写器线程可以拆分或连接区间,或修改区间中的值。任何读取器线程仅在一个时间间隔内读取值(读取器可能读取多个时间间隔,但我不必序列化所有读取 - 在两次读取之间进行写入是可以的)。每个读取器每次写入大约有 20-80 次读取。此外,我仍然需要确定读者人数,但应该是 2-8 人左右。
我考虑使用 list 在中间添加和删除元素。只有有限数量的间隔 - 所以使用 map 可能是不正确的。这种访问(一个写入器,多个读取器)不受 STL 列表的良好支持。boost::intrusive::list 似乎合适。在侵入性列表的顶部,我将不得不获取锁来读/写间隔。
此外,我了解侵入式列表可用于比 STL 列表更好的缓存位置(以及为包含的对象分配适当的内存)。
方法好吗?如果是,我也很想知道您使用 intrusive::list 的经验,特别是对于多线程应用程序。
c++ - 我可以创建多少个 CRITICAL_SECTION?
我可以初始化和使用的关键部分的数量是否有限制?
我的应用程序创建了许多(几千个)需要线程安全的对象。如果我在每个中都有一个关键部分,那会占用太多资源吗?
我认为因为我需要声明自己的 CRITICAL_SECTION 对象,所以我不会像使用 Win32 Mutex 或 Event 那样浪费内核资源?但我只是有一个挥之不去的疑问......?
老实说,对于我的应用程序来说,并不是所有这些对象都需要是线程安全的,但关键部分位于库中的一些低级基类中,我确实需要几千个!
我可能有机会修改这个库,所以我想知道是否有任何方法可以懒惰地创建(然后从那时起使用)关键部分,只有当我检测到对象正在从不同的线程使用它时创建于?或者这就是 Windows 会为我做的?
thread-safety - 对未对齐数据的联锁操作
win32 互锁函数为数据的原子操作提供了一种机制。它们应该是线程安全的和多处理器安全的。
如果数据没有对齐会发生什么?联锁操作仍然是原子的?例如:增加一个未对齐的整数。
泰
.net - 共享 XElement 作为 SiteMap
我有一个自定义 CMS,我在其中使用静态 XElement 作为站点地图。当地图发生更新时,我正在同步编写器线程,但对阅读器不做任何事情,只是让他们在需要时获取 XElement。
在测试中,我认为如果我从读取器线程枚举 XElement,而我在另一个写入线程上更新它,我会得到一个异常。事实并非如此。只是想知道是否有人可以向我解释他们是否发现这种方法有任何重大问题。它似乎不应该是安全的,但到目前为止我的所有测试都表明它是安全的。
c# - 是 C# '??' 操作员线程安全吗?
每个人都知道这不是线程安全的:
那这个呢?
c# - .NET 加密类的线程安全?
我的高级目标是创建一个封装我的 .NET 应用程序加密的静态实用程序类。在里面,我想尽量减少不必要的对象创建。
我的问题是:在 .NET Framework 中实现对称加密的类的线程安全性是什么? 具体来说System.Security.Cryptography.RijndaelManaged
以及ICryptoTransform
它生成的类型。
例如,在我的类构造函数中,我可以简单地按照以下几行做一些事情吗?
回避在这个类中存在 Key 和 IV 是否安全的问题,这个示例块提出了许多其他问题:
我可以不断重复使用 EncryptorTransform 和 DecryptorTransform 吗?和属性暗示“是”
*.CanReuseTransform
,*.CanTransformMultipleBlocks
但有什么我应该注意的警告吗?由于
RijndaelManaged
实现IDisposable
了我的倾向是将它放在一个using
块中,特别是因为它可能与外部操作系统级库相关联。既然我把ICryptoTransform
物体放在身边,有什么注意事项吗?可能是最重要的问题,在高度多线程的环境中,我是否会遇到
ICryptoTransform
在线程之间共享对象的问题?如果#3 的答案是它不是线程安全的,那么我在使用
ICryptoTransform
对象时是否会因锁定而导致性能严重下降?(我想取决于负载。)RijndaelManaged
每次都简单地实例化 new 会更好吗?还是存储一个RijndaelManaged
并new RijndaelManaged().CreateEncryptor(...)
每次生成?
我希望有人知道这些在幕后是如何工作的,或者对类似实现的问题有经验。我发现很多此类性能和线程相关问题通常在负载相当大时才会显现出来。
谢谢!
scala - 我的 Scala 演员的属性是否应该标记为@volatile?
在 Scala 中,如果我有一个简单的类,如下所示:
我的领域sum
应该被标记@volatile
吗?虽然参与者在逻辑上是单线程的(即消息是按顺序处理的),但各个反应可能发生在单独的线程上,因此state
变量可能会在一个线程上被更改,然后从另一个线程读取。
c# - C#:线程安全事件
下面的实现是线程安全的吗?如果不是,我错过了什么?我应该在volatile
某处有关键字吗?还是OnProcessingCompleted
方法中某处的锁?如果有,在哪里?
注意:我之所以有私有事件和显式接口的东西,是因为它是一个抽象基类。从它继承的类不应该直接对该事件做任何事情。添加了类包装器,使其更清晰=)
jpa - 有没有办法更改方法上的 JPA 获取类型?
有没有办法在不编辑实体对象的情况下更改单个方法的 JPA 获取类型?
我有一个由 JPA 实体类组成的共享 ORM 层。这个 ORM 层由两个 DAO 层访问。一个 DAO 需要延迟获取,因为它适用于我的 Web 应用程序,另一个需要急切获取,因为我需要它是线程安全的。
这是我的线程安全 DAO 中的示例方法,
我如何让这个方法(或整个类)使用渴望获取?
c++ - 没有互斥的线程安全静态变量?
我记得读过在方法中声明的静态变量不是线程安全的。(参见Todd Gardner提到的 Meyer 的单身呢?)
我的库为最终用户生成 C++ 代码,以作为其应用程序的一部分进行编译。它生成的代码需要以线程安全的跨平台方式初始化静态变量。我想用来boost::call_once
对变量初始化进行互斥,但最终用户会暴露于 Boost 依赖项。
有没有办法让我做到这一点,而不需要对最终用户产生额外的依赖?