【发布时间】:2008-12-12 07:28:49
【问题描述】:
我一直在想,在某些东西自动成为线程安全之前,你必须深入到什么程度?
快速示例:
int dat = 0;
void SetInt(int data)
{
dat = data;
}
.. 这种方法会被认为是线程安全的吗?我通常将我所有的 set-methods 包装在互斥体中,只是为了确定,但每次我这样做时,我不禁认为这是一种无用的性能开销。我想这一切都分解为编译器生成的程序集?线程什么时候能够闯入代码?每个汇编指令或每个代码行?线程可以在方法堆栈的设置或销毁期间中断吗?像 i++ 这样的指令会被认为是线程安全的吗?如果不是,那么 ++i 呢?
这里有很多问题 - 我不希望有直接的答案,但有关该主题的一些信息会很棒:)
[更新] 因为我现在很清楚(谢谢你们
【问题讨论】:
-
更新了原始问题并进行了跟进:)
-
关于原子性和汇编指令,这不是真的。内存提取可能会在 CPU 执行其他操作时执行,或者某些形式的分支预测可能会执行两个分支并丢弃不正确的分支。 x86 确实有一些原子操作,但不是全部都有。
-
教科书的答案是,这取决于您遵循的线程标准,该标准通常提供一组特定的保证。在 POSIX 线程的情况下,除非您的编译器、平台库或更新的语言标准提供了原子操作,否则当另一个线程正在或可能正在访问它时,您不能修改任何对象...期间。
标签: c++ multithreading thread-safety