CPU是否以原子方式为内存分配值?

Pon*_*oni 9 c cpu memory-management shared-memory

一段时间以来我一直在想的一个简单的问题; CPU是否以原子方式分配值,或者是逐位分配值(例如,32位整数).
如果它是一点一滴的,访问这个确切位置的另一个线程是否可以获得待分配值的"部分"?

想一想:
我有两个线程和一个共享的"unsigned int"变量(称之为"g_uiVal").
两个线程循环.
On正在使用printf("%u \n",g_uiVal)打印"g_uiVal".
第二个只是增加这个数字.
打印线程是否会打印出完全不属于"g_uiVal"值的部分?

在代码中:

unsigned int g_uiVal;

void thread_writer()
{
 g_uiVal++;
}
void thread_reader()
{
 while(1)
  printf("%u\n", g_uiVal);
}
Run Code Online (Sandbox Code Playgroud)

cra*_*cot 5

取决于CPU和内存的总线宽度.在PC上下文中,除了非常古老的CPU之外,最多32位访问的访问是原子的; 64位访问可能是也可能不是.在嵌入式空间中,许多(大多数?)CPU是32位宽,并且没有任何更宽的规定,所以int64_t保证是非原子的.