Saya menggunakan Cygwin GCC dan menjalankan kode ini:
#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;
}
Disusun dengan baris: g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
.
Ini mencetak 1000, yang benar. Namun, saya mengharapkan jumlah yang lebih rendah karena utas menimpa nilai yang sebelumnya bertambah. Mengapa kode ini tidak saling akses?
Mesin uji saya memiliki 4 inti, dan saya tidak membatasi program yang saya ketahui.
Masalah tetap ada saat mengganti konten yang dibagikan foo
dengan sesuatu yang lebih kompleks, misalnya
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
mencetak 999 atau 998 pada sistem saya.
u
kembali ke memori. CPU benar-benar akan melakukan hal-hal luar biasa seperti pemberitahuan bahwa garis memori untuku
tidak ada di cache CPU dan itu akan memulai kembali operasi tambahan. Inilah sebabnya mengapa berpindah dari x86 ke arsitektur lain bisa menjadi pengalaman yang membuka mata!