Cacheについて
2479 ワード
まずコードを見てみましょう.
このコードの重点を説明すると、2つのスレッドが2つのcpuコア上で実行され、それぞれx=1、r 1=yが実行される.y = 1, r2 = x;いずれのスレッドが先に実行されても、あるいは一緒に実行されても、通常r 1=1またはr 2=1または両方が1であり、すなわちmain関数における判断r 1とr 2が同じ0であるという判断は成立せず、印刷も発生しない.
少なくともデュアルコアマシンで実際に動作している場合は、目を信じないはずです.
印刷から、2つのスレッドが実行された後、r 1==r 2==0の場合が発生したことがわかりますが、CPUは私たちをからかっているのでしょうか.
CPUが私たちをからかっていないのは、私たちがそれを理解していないからです.(続き)
#include <Windows.h>
#include <stdio.h>
int x, y, r1, r2;
HANDLE Event1, Event2, EventMain1, EventMain2;
DWORD
_stdcall
ThreadProc1 (
LPVOID lpThreadParameter
)
{
while (TRUE) {
WaitForSingleObject(Event1, INFINITE);
while (rand() % 8 != 0);
x = 1;
r1 = y;
SetEvent(EventMain1);
}
}
DWORD
_stdcall
ThreadProc2 (
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
", dectected++, i);
}
}
}
このコードの重点を説明すると、2つのスレッドが2つのcpuコア上で実行され、それぞれx=1、r 1=yが実行される.y = 1, r2 = x;いずれのスレッドが先に実行されても、あるいは一緒に実行されても、通常r 1=1またはr 2=1または両方が1であり、すなわちmain関数における判断r 1とr 2が同じ0であるという判断は成立せず、印刷も発生しない.
少なくともデュアルコアマシンで実際に動作している場合は、目を信じないはずです.
detected 305, i 202654
detected 306, i 204704
detected 307, i 205029
detected 308, i 206454
detected 309, i 207135
detected 310, i 208178
detected 311, i 208610
detected 312, i 208879
detected 313, i 208896
detected 314, i 208960
detected 315, i 209003
detected 316, i 209869
detected 317, i 210573
detected 318, i 211259
detected 319, i 211275
detected 320, i 211487
detected 321, i 212646
detected 322, i 212963
detected 323, i 213317
detected 324, i 213382
detected 325, i 213473
detected 326, i 213588
detected 327, i 214940
detected 328, i 215055
detected 329, i 215271
(マップが不便なので、そのまま本機の印刷をコピーしました)印刷から、2つのスレッドが実行された後、r 1==r 2==0の場合が発生したことがわかりますが、CPUは私たちをからかっているのでしょうか.
CPUが私たちをからかっていないのは、私たちがそれを理解していないからです.(続き)