Tôi đang sử dụng Cygwin GCC và chạy mã này:
#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;
}
Biên soạn với dòng: g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o
.
Nó in 1000, đó là chính xác. Tuy nhiên, tôi mong đợi một số lượng ít hơn do các luồng ghi đè lên một giá trị đã tăng trước đó. Tại sao mã này không bị truy cập lẫn nhau?
Máy thử nghiệm của tôi có 4 lõi và tôi không đặt bất kỳ hạn chế nào đối với chương trình mà tôi biết.
Sự cố vẫn tiếp diễn khi thay thế nội dung được chia sẻ foo
bằng nội dung phức tạp hơn, ví dụ:
if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}
while true; do res=$(./a.out); if [[ $res != 1000 ]]; then echo $res; break; fi; done;
in 999 hoặc 998 trên hệ thống của tôi.
u
lại vào bộ nhớ. CPU sẽ thực sự làm những điều đáng kinh ngạc như thông báo rằng dòng bộ nhớu
không có trong bộ nhớ cache của CPU và nó sẽ khởi động lại hoạt động gia tăng. Đây là lý do tại sao chuyển từ x86 sang các kiến trúc khác có thể là một trải nghiệm mở rộng tầm mắt!