Hãy tưởng tượng một chương trình có hai luồng. Họ đang chạy đoạn mã sau (CAS đề cập đến Compare and Swap):Có thể cạnh tranh các hoạt động nguyên tử không?
// Visible to both threads
static int test;
// Run by thread A
void foo()
{
// Check if value is 'test' and swap in 0xdeadbeef
while(!CAS(&test, test, 0xdeadbeef)) {}
}
// Run by thread B
void bar()
{
while(1) {
// Perpetually atomically write rand() into the test variable
atomic_write(&test, rand());
}
}
Có thể cho thread B để vĩnh viễn gây ra thread của CAS thất bại như vậy 0xdeadbeef không bao giờ được ghi vào 'thử'? Hay tự nhiên lập kế hoạch jitter có nghĩa là trong thực tế điều này không bao giờ xảy ra? Điều gì sẽ xảy ra nếu một số công việc được thực hiện bên trong vòng lặp while A?
Tại sao nó chỉ thực hiện hai lần? Nếu nó tối ưu hóa việc lấy thử nghiệm, không phải là hiệu ứng mà nó có thể lặp * mãi mãi *? Việc so sánh và hoán đổi sẽ luôn thất bại bởi vì so sánh sẽ vĩnh viễn sai, trừ khi bạn may mắn và rand() trả về giá trị mà kiểm tra xảy ra trước khi luồng A vào vòng lặp và luồng A xảy ra để chạy vào đúng thời điểm. –
Ngoài ra khi bạn nói không chắc chắn, bạn có nghĩa là không đủ rằng bạn sẽ không phản đối việc sử dụng mã này trong phần mềm sản xuất? Sẽ rất thú vị khi thử tính toán xác suất được đơn giản hóa. –
Khi cá nhân tôi nói không chắc chắn khi đề cập đến một vấn đề luồng, tôi có nghĩa là tôi muốn nó cố định để nó thực sự không xảy ra. Tôi đã có quá nhiều "sẽ không xảy ra" nổ tung lên tôi. –