Mee*_*eeh 7 c++ multithreading thread-safety
我一直在想,在某些东西是自动线程安全之前你必须要做的事情有多深?
快速举例:
int dat = 0;
void SetInt(int data)
{
dat = data;
}
Run Code Online (Sandbox Code Playgroud)
..这种方法会被视为线程安全吗?为了确定,我通常将所有的设置方法都包含在互斥锁中,但每次我这样做时,我都忍不住认为这是一个无用的性能开销.我想这一切都分解为编译器生成的程序集?什么时候线程能够闯入代码?每个汇编指令还是每个代码行?在设置或销毁方法堆栈期间线程是否可以中断?像i ++这样的指令是否会被认为是线程安全的 - 如果不是,那么++ i呢?
Lotsa在这里提问 - 而且我不希望直接回答,但关于这个主题的一些信息会很棒:)
[更新]因为现在对我来说很明显(对你们这些人来说<3),在线程中唯一原子保护的东西是汇编指令,我知道这个问题:互斥和信号量包装类怎么样?像这样的类通常使用制作callstacks的方法 - 而且通常使用某种内部计数器的自定义semaphoreclasses不能保证原子/线程安全(无论你想要什么,只要你知道我的意思,我不在乎: P)
一般来说,线程上下文切换可以在任意两个汇编语言指令之间随时发生。CPU 完全不知道汇编语言如何映射到源代码。此外,对于多个处理器,其他指令可以同时在不同的 CPU 内核上执行。
话虽如此,在示例中,将 CPU 大小的字分配给内存位置通常是原子操作。这意味着从观察者(另一个线程)的角度来看,分配要么尚未开始,要么已经完成。不存在中间状态。
多处理中有许多微妙之处,因此最好了解您所工作的硬件和操作系统环境的可能性。