Cygwin GCC를 사용하고 있으며 다음 코드를 실행합니다.
#include <iostream>
#include <thread>
#include <vector>
using namespace std;
unsigned u = 0;
void foo()
{
u++;
}
int main()
{
vector<thread> threads;
for(int i = 0; i < 1000; i++) {
threads.push_back (thread (foo));
}
for (auto& t : threads) t.join();
cout << u << endl;
return 0;
}
라인으로 컴파일 : g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
.
1000을 인쇄합니다. 그러나 이전에 증가한 값을 덮어 쓰는 스레드로 인해 더 적은 수를 예상했습니다. 이 코드가 상호 액세스의 영향을받지 않는 이유는 무엇입니까?
내 테스트 머신에는 4 개의 코어가 있으며 내가 아는 프로그램에 제한을 두지 않습니다.
공유 내용을 foo
더 복잡한 것으로 대체 할 때 문제가 지속됩니다.
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
내 시스템에서 999 또는 998을 인쇄하는 것과 같습니다 .
u
메모리에 다시 쓰기 위해 이동한다고 가정합니다 . CPU는 실제로 메모리 라인u
이 CPU의 캐시에 없다는 사실을 알아 채고 증분 작업을 다시 시작하는 것과 같은 놀라운 작업을 수행합니다. 이것이 x86에서 다른 아키텍처로 전환하는 것이 눈을 뜨게하는 경험이 될 수있는 이유입니다!