浅谈 Cache
来源:互联网 发布:夜神模拟器修改mac 编辑:程序博客网 时间:2024/06/04 00:05
先来看一段代码:
#include <Windows.h>#include <stdio.h>int x, y, r1, r2;HANDLE Event1, Event2, EventMain1, EventMain2;DWORD_stdcallThreadProc1 ( LPVOID lpThreadParameter ){ while (TRUE) { WaitForSingleObject(Event1, INFINITE); while (rand() % 8 != 0); x = 1; r1 = y; SetEvent(EventMain1); }}DWORD_stdcallThreadProc2 ( LPVOID lpThreadParameter ){ while (TRUE) { WaitForSingleObject(Event2, INFINITE); while (rand() % 8 != 0); y = 1; r2 = x; SetEvent(EventMain2); }}void main(){ HANDLE Thread1, Thread2; Thread1 = CreateThread(NULL, 0, ThreadProc1, NULL, 0, NULL); Thread2 = CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL); SetThreadAffinityMask(Thread1, 1); SetThreadAffinityMask(Thread2, 2); Event1 = CreateEvent(NULL, FALSE, FALSE, NULL); Event2 = CreateEvent(NULL, FALSE, FALSE, NULL); EventMain1 = CreateEvent(NULL, FALSE, FALSE, NULL); EventMain2 = CreateEvent(NULL, FALSE, FALSE, NULL); int dectected = 0; for (int i = 0; ;i++) { x = 0; y = 0; SetEvent(Event1); SetEvent(Event2); WaitForSingleObject(EventMain1, INFINITE); WaitForSingleObject(EventMain2, INFINITE); if (r1 == 0 && r2 == 0) { printf("detected %d, i %d\n", dectected++, i); } }}
描述一下这段代码的重点,起两个线程在两个cpu 核心上执行,分别执行 x = 1, r1= y; y = 1, r2 = x;无论哪个线程先执行,或一起执行,按照常理执行结果一般为 r1 = 1 或 r2 = 1 或者两个都为 1,也就是在 main 函数中的判断 r1 和 r2 同为 0 的判断是不可能成立的,打印也不会出现。
当你真实在一台至少双核机器上运行时,你应该不会相信你的眼睛。
detected 305, i 202654detected 306, i 204704detected 307, i 205029detected 308, i 206454detected 309, i 207135detected 310, i 208178detected 311, i 208610detected 312, i 208879detected 313, i 208896detected 314, i 208960detected 315, i 209003detected 316, i 209869detected 317, i 210573detected 318, i 211259detected 319, i 211275detected 320, i 211487detected 321, i 212646detected 322, i 212963detected 323, i 213317detected 324, i 213382detected 325, i 213473detected 326, i 213588detected 327, i 214940detected 328, i 215055detected 329, i 215271(由于贴图不方便,直接把本机的打印复制下来了)
从打印中可以得出,在两个线程运行完后,r1== r2 == 0 的情况居然出现了,难道 CPU 在逗我们么。
CPU 没有逗我们,是我们不够了解它。(待续)
4 0
- 浅谈 Cache
- 浅谈Cache Memory--目录
- 浅谈Cache Memory--目录
- 浅谈数据库系统中的cache
- [MySQL] 浅谈 MySQL Query Cache
- lighttpd 负载均衡-反向代理+cache浅谈
- nginx 负载均衡-反向代理+cache浅谈
- 王齐老师 浅谈cache memory
- (转)浅谈数据库系统中的cache
- 浅谈Oracle数据库中的缓存-Cache (IO)
- 浅谈Oracle数据库中的缓存-Cache (IO)
- 浅谈Oracle数据库中的缓存-Cache (IO)
- nginx 负载均衡-反向代理+cache浅谈
- (转载)浅谈高端CPU Cache Page-Coloring
- 浅谈HTML5离线缓存(Application Cache)
- 浅谈一下为什么cache不在HIS中应用- -
- 个人随笔对.net cookie session cache的浅谈
- cache
- freemarker的TemplateExceptionHandler使用
- device unauthorized. Please check the confirmation dialog on your device.
- webui tab
- 141024启动iptables失败,发现时系统里面没有/etc/sysconfig/iptables这个文件,touch /etc/sysconfig/iptables就成功启动了
- input表单——隐藏域type="hidden"的使用方法
- 浅谈 Cache
- 简单优化:Zipalign
- std::out_of_range错误
- 软件测试工程师-meitu(2014年校园招聘笔试)
- 学习时更容易犯困,这正常吗?
- 今日收获--关于编程思想的小结(2014-09-11 16:46:20)
- 禁止Tortoisesvn自动合并
- while(1);是死循环的意思。只要括号里为非零,也就是真值,它就一直循环这条句子。
- IOS7 点击空白处隐藏键盘的几种方法