Tôi cần đặt cờ cho một chuỗi khác để thoát. Chủ đề khác kiểm tra cờ thoát theo thời gian. Tôi có phải sử dụng nguyên tử cho lá cờ hoặc chỉ là một bool đơn giản là đủ và tại sao (với một ví dụ về những gì chính xác có thể đi sai nếu tôi sử dụng đồng bằng bool)?Tôi có phải sử dụng nguyên tử <bool> cho biến bool "thoát" không?
#include <future>
bool exit = false;
void thread_fn()
{
while(!exit)
{
//do stuff
if(exit) break;
//do stuff
}
}
int main()
{
auto f = std::async(std::launch::async, thread_fn);
//do stuff
exit = true;
f.get();
}
Tôi khó có thể thấy cách truy cập một 'bool' có thể là gì ngoài nguyên tử trong thực tế (mặc dù tôi đồng ý trong tiêu chuẩn chính thức, đó là một vấn đề khác). Dù sao, ngoài điều kiện chủng tộc, tôi tin rằng người ta cũng cần một rào cản bộ nhớ (được cung cấp bởi 'nguyên tử <>' hoặc 'std :: mutex') để đảm bảo trình biên dịch không lưu trữ dữ liệu hoặc sắp xếp lại hướng dẫn. Tuy nhiên tôi thiếu kiến thức lý thuyết để giải thích một cách chính xác (mặc dù tôi biết cách sử dụng nó trong thực tế), chăm sóc để khai sáng cho tôi nếu bạn có thể? Hay tôi nên tạo một câu hỏi mới? – syam
Để xây dựng (hẹp), điều kiện chạy dữ liệu trong tiêu chuẩn không chỉ là về những gì một luồng có thể thực hiện được với chuỗi khác. Đó cũng là về tối ưu hóa hoặc sắp xếp lại mã. Trình biên dịch có thể giả định không có chủng tộc dữ liệu, vì vậy nó có thể giả định rằng nếu một luồng đọc một biến nhưng không sửa đổi nó, giá trị không thể thay đổi giữa các điểm đồng bộ hóa. Chủ đề của bạn có thể không bao giờ thoát. Hoặc nếu một chuỗi đặt cờ mà không sử dụng nó, sửa đổi có thể được sắp xếp lại trước bất kỳ mã nào khác (sau điểm đồng bộ hóa cuối cùng). Tôi thậm chí còn bỏ qua sự kết hợp bộ nhớ cache. Đây là lý do tại sao nguyên tử tồn tại. –
@Andy Trích dẫn chính xác đến mức - đủ để tôi sử dụng nguyên tử. Hy vọng rằng Pete trong câu trả lời của ông sẽ làm rõ mô tả các vấn đề thực tế trong mã ví dụ của tôi có thể phát sinh từ việc sử dụng bool đơn giản. –
PowerGamer