Intel プロセッサのアウト オブ オーダー効果を実証するために、マルチスレッド プログラムを作成しました。プログラムはこの記事の最後に添付されています。期待される結果は、x が handler1 によって 42 または 0 として出力されたときです。ただし、実際の結果は常に 42 です。これは、アウト オブ オーダー効果が発生しないことを意味します。
コマンド「gcc -pthread -O0 out-of-order-test.c」でプログラムをコンパイルしました Intel IvyBridge プロセッサ Intel(R ) Xeon(R) CPU E5-1650 v2。
順不同の効果を見るために何をすべきか知っている人はいますか?
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
int f = 0, x = 0;
void* handler1(void *data)
{
while (f == 0);
// Memory fence required here
printf("%d\n", x);
}
void* handler2(void *data)
{
x = 42;
// Memory fence required here
f = 1;
}
int main(int argc, char argv[])
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, handler1, NULL);
pthread_create(&tid2, NULL, handler2, NULL);
sleep(1);
return 0;
}