LeaveCriticalSection()是否将缓存的变量刷新到内存中?

时间:2017-03-09 02:45:18

标签: c multithreading winapi

说我有以下代码:

// global variable
int i = 0;

...

EnterCriticalSection(&CriticalSection);
i = 45;
i = 24;
i = 32;
LeaveCriticalSection(&CriticalSection);

CPU是否可以缓存变量i,并且在修改i时,缓存的副本是经过修改的副本,并且在调用LeaveCriticalSection()时,缓存的值为{{1刷新到内存(例如,其他线程可以看到更新的值)?

1 个答案:

答案 0 :(得分:5)

根据this page from MSDN

  

以下同步函数使用适当的障碍来确保内存排序:

     
      
  • 进入或离开关键部分的功能。
  •   

这并不一定意味着数据被刷新到内存"。实际上,您可能会认为某些缓存是内存的一部分,而其他缓存可能与单个CPU相关联。适当的障碍"为机器架构做必要的事情,以保证所有CPU都具有一致的视图。

有关详细信息,您可能需要从memory barriersmemory ordering上的维基百科页面开始。