我一直在想,在某些东西自动成为线程安全之前,你必须深入到什么程度?
快速示例:
int dat = 0;
void SetInt(int data)
{
dat = data;
}
.. 这种方法会被认为是线程安全的吗?我通常将我所有的 set-methods 包装在互斥体中,只是为了确定,但每次我这样做时,我不禁认为这是一种无用的性能开销。我想这一切都分解为编译器生成的程序集?线程什么时候能够闯入代码?每个汇编指令或每个代码行?线程可以在方法堆栈的设置或销毁期间中断吗?像 i++ 这样的指令会被认为是线程安全的吗?如果不是,那么 ++i 呢?
这里有很多问题-我不希望直接回答,但是有关该主题的一些信息会很棒:)
[更新] 因为我现在很清楚(谢谢你们 <3),线程中唯一保证原子的东西是汇编指令,我知道我开始思考:互斥锁和信号量包装类呢?像这样的类通常使用制作调用堆栈的方法 - 并且通常使用某种内部计数器的自定义信号量类不能保证是原子/线程安全的(无论你想怎么称呼它,只要你知道我的意思,我不在乎: )