以下函数是线程安全的(在C中)还是必须添加互斥锁?
int example() {
return g_maxValue++;
}
其中int g_maxValue
是某个全局整数。如果是,那么对于所有整数类型(如std::uint64_t
)是否也是如此?
不,不是。增量操作在内部计算为三个不同的操作:
加载运算符
< code >添加1
写入运算符
如果并行执行一个<code>write</code>操作,则可能会覆盖另一个操作。
只有原子变量(std::atomic
)才能保证线程安全。
来自C标准:
如果一个程序在不同的线程中包含两个冲突的操作,则它的执行包含数据竞争,其中至少一个不是原子的,并且两者都不发生在另一个之前。任何这样的数据竞争都会导致未定义的行为。
编译器不必考虑非原子变量的线程安全性,因此允许将转换为多个操作(伪代码):
问题内容: 我正在用Java编写一个程序,使一些汽车相互竞争。每辆车都是单独的线程。 当汽车完成比赛时,每个人都会调用此方法。我已经在不同的计时器速度下测试了该方法,并且看起来效果很好。但是我确实意识到每个线程都在访问变量carsComplete,有时恰好在同一时间(至少在date命令给我的范围内)。 所以我的问题是:这个方法是线程安全的吗? 问题答案: 不,您应该使用。看看它的方法。
问题内容: 我想创建一个非线程安全的代码块进行实验,这些是2个线程将要调用的函数。 此代码线程安全吗? 如果不是,我可以理解为什么它不是线程安全的,以及通常使用哪种语句导致非线程安全的操作。 如果它是线程安全的,如何使它显式地成为非线程安全的? 问题答案: 由于有GIL,单个操作码是线程安全的,但除此之外: *多个线程共享的 *每个 资源都 必须 有一个锁。
问题内容: 我发现以下Java代码。 其中,和是。 我知道基本类型的基本操作是线程安全的,但是我不确定。如果上述是必要的,是否可能有更好的类来处理这种操作? 问题答案: 否。该操作不是线程安全的。对于涉及分配给共享字段或数组元素的任何表达式,它要求锁定和/或适当的“先于”关系链是线程安全的。 (在字段声明为的情况下,“先发生”关系存在…但是仅在读和写操作上存在。该操作由一个读和一个写操作组成。它们
问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa
问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。
问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn
本文向大家介绍什么是JavaScript中的增量(++)运算符?,包括了什么是JavaScript中的增量(++)运算符?的使用技巧和注意事项,需要的朋友参考一下 增量运算符将整数值加1。这是一个示例,其中使用递增运算符两次将a的值递增两次 示例
如果这个家伙不是线程安全的,是否有类似的东西(可能来自Apache,...)? 谢了。