gpt4 book ai didi

C++ 内存模型 char 与 word,并发性?摘自斯特鲁斯特鲁普的书

转载 作者:行者123 更新时间:2023-12-01 14:37:07 25 4
gpt4 key购买 nike

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

if a linker allocated c and b in the same word in memory and (like most modern hardware)",

变量cb会发生什么?

据我了解,在某些硬件上,一个字是 2 个字节,并且两个变量都包含在其中,一个线程可能会覆盖另一个线程的 char

Stroustrup 进一步指出:

Without a well-defined and reasonable memory model, thread 1 mightread the word containing b and c, change c, and write the word backinto memory. At the same time, thread 2 could do the same with b.Then, whichever thread managed to read the word first and whicheverthread man- aged to write its result back into memory last woulddetermine the result. We might get 10, 01, or 11 (but not 00). Thememory model saves us from such chaos; we get 11. The reason that 00can not happen is that the initializations of b and c are done (bythe compiler or the linker) before either thread starts.

我的困惑是,为了解决这个问题,C++ 链接器是否将 c 放置在一个 2 字节内存地址中,并将 b 放置在另一个 2 字节内存地址中?

// 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++ 内存模型 char 与 word,并发性?摘自斯特鲁斯特鲁普的书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63317229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com