Stroustrup在C++第4版第1193页中给出了以下示例。我的问题是使用两个线程的并发程序,一个线程用于f(),另一个线程用于g()和Stroustrup的语句:

变量cb会怎样?
据我了解,在某些硬件上,一个单词是2个字节,并且两个变量都包含在其中,一个线程可能会覆盖另一个线程的char
Stroustrup进一步声明以下内容:

对于此问题的解决方案,我的困惑是C++链接程序是否将c放在一个2字节的内存地址中,而b放在另一个?

// thread 1
char c = 0;
void f()
{
    c = 1;
    int x = c;
}

char b = 0;
void g()
{
    b = 1;
    int y = b;
}

最佳答案

Stroustrup提出的要点是,需要C++实现来执行特定硬件上所需的一切,以使事情按内存模型的要求工作。那可能取决于硬件的细节。特定的缓存体系结构可能允许从不同的线程同时修改同一“字”中的两个值。如果特定的缓存体系结构无法做到这一点,那么实现工作就是确保每个单独的C++对象仍然能够按照内存模型正确运行。这可能需要插入填充或进行特殊的写操作等。

关于c++ - C++内存模型char vs word,并发?从Stroustrup书中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63317229/

10-11 18:44