Không, không. Các hoạt động test_and_set()
chính nó là nguyên tử, do đó, nó không quan trọng như thế nào sâu chủ đề khác nhau 'ngăn xếp được ngăn xếp.
Để chứng minh điều này, hãy xem xét các trường hợp cơ sở nơi đối tượng atomic_flag
được "tiếp xúc" trực tiếp:
static atomic_flag flag = ATOMIC_FLAG_INIT;
void threadMethod() {
bool wasFirst = !flag.test_and_set();
if(wasFirst) cout << "I am thread " << this_thread::get_id() << ", I was first!" << endl;
else cout << "I am thread " << this_thread::get_id() << ", I'm the runner-up" << endl;
}
Nếu hai luồng nhập threadMethod
- với một thread (t1
) hơi trước kia (t2
) sau đó chúng tôi có thể mong đợi giao diện điều khiển đầu ra được những điều sau đây (theo thứ tự):
I am thread t1, I was first!
I am thread t2, I'm the runner-up
Bây giờ nếu cả hai đề nhập cùng một lúc, nhưng t2
là một microseco nd trước t1
, nhưng t2
sau đó trở thành chậm hơn so với t1
vì nó ghi vào thiết bị xuất chuẩn, sau đó đầu ra sẽ là:
I am thread t1, I'm the runner-up
I am thread t2, I was first!
... vì vậy các cuộc gọi đến test_and_set
vẫn còn nguyên tử, mặc dù sản lượng không nhất thiết phải theo thứ tự mong đợi.
Bây giờ nếu bạn đã quấn flag
trong phương pháp khác (không sắp xếp theo hàng chỉ để đảm bảo), như vậy ...
__declspec(noinline)
bool wrap() {
return !flag.test_and_set();
}
void threadMethod() {
bool wasFirst = wrap();
if(wasFirst) cout << "I am thread " << this_thread::get_id() << ", I was first!" << endl;
else cout << "I am thread " << this_thread::get_id() << ", I'm the runner-up" << endl;
}
... sau đó chương trình sẽ không cư xử bất kỳ khác nhau - bởi vì false
hoặc true
trả lại bool
giá trị từ test_and_set()
sẽ vẫn nằm trong ngăn xếp của mỗi chuỗi. Ergo, gói atomic_flag
không thay đổi nguyên tử của nó.
Truy cập và truy cập trực tiếp bằng cuộc gọi hàm không ảnh hưởng đến bản chất nguyên tử của 'ready'. Bạn có thể nói làm thế nào bạn sử dụng 'ready' như tôi nghi ngờ điều này có thể là vấn đề thực sự? –
@RichardCritten Tôi giả sử (tôi chỉ là một sự tò mò, không phải là một chương trình thực sự) một luồng khác có thể lấy trạng thái sẵn sàng của Thing bằng cách lặp qua 'isReady', như' while (! IsReady()) do_something() '. Nó có ý nghĩa không? – Ignorant