说我有以下代码:
// global variable
int i = 0;
...
EnterCriticalSection(&CriticalSection);
i = 45;
i = 24;
i = 32;
LeaveCriticalSection(&CriticalSection);
CPU是否可以缓存变量i
,并且在修改i
时,缓存的副本是经过修改的副本,并且在调用LeaveCriticalSection()
时,缓存的值为{{1刷新到内存(例如,其他线程可以看到更新的值)?
答案 0 :(得分:5)
以下同步函数使用适当的障碍来确保内存排序:
- 进入或离开关键部分的功能。
这并不一定意味着数据被刷新到内存"。实际上,您可能会认为某些缓存是内存的一部分,而其他缓存可能与单个CPU相关联。适当的障碍"为机器架构做必要的事情,以保证所有CPU都具有一致的视图。
有关详细信息,您可能需要从memory barriers和memory ordering上的维基百科页面开始。