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

标签 c multithreading winapi

假设我有以下代码:

// global variable
int i = 0;

...

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

CPU能否缓存变量i,当i被修改时,缓存的副本就是被修改的副本,而当LeaveCriticalSection()时> 被调用时,i 的缓存值被刷新到内存(以便其他线程可以看到更新的值)?

最佳答案

根据this page from MSDN

The following synchronization functions use the appropriate barriers to ensure memory ordering:

  • Functions that enter or leave critical sections.

这并不一定意味着数据被“刷新到内存”。事实上,您可能会认为某些缓存是内存的一部分,而其他缓存可能与单个 CPU 相关联。 “适当的屏障”会尽机器架构所需的一切来保证所有 CPU 具有一致的 View 。

如需了解更多信息,您可能需要从 memory barriers 上的维基百科页面开始和 memory ordering .

关于c - LeaveCriticalSection() 是否将缓存的变量刷新到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42685730/

相关文章:

c - Windows 上多线程应用程序中非阻塞服务器/监听套接字的最佳方法?

winapi - 如何从其句柄获取控件ID?

c++ - CreateFont() 创建的字体规范和大小不正确

c - 什么是 C 中指向对象类型的指针?

c - 我不知道为什么这段代码会给我带来读取访问冲突。理论上,取消引用指针并减去另一个字符应该可行

java - 在java中使用Executors时出现内存不足错误

c++ - 使用 C++ 的密码到期日期?

c - 如何在 C 中的 char* 字符串末尾粘贴 null

c - 以下代码如何使 PC 发出蜂鸣声?

php在每个foreach之后获取数组中的一些元素