Tôi có một phụ huynh và một sợi công nhân chia sẻ một cờ bool và một std :: vector. Cha mẹ chỉ đọc (tức là, đọc bool hoặc gọi my_vector.empty()); công nhân chỉ viết.Một người đọc. Một nhà văn. Một số câu hỏi chung về mutexes và nguyên tử-xây dựng
Câu hỏi của tôi:
Tôi có cần phải mutex bảo vệ lá cờ bool?
Tôi có thể nói rằng tất cả các thao tác đọc/ghi bool vốn là các hoạt động nguyên tử không? Nếu bạn nói Có hoặc Không, bạn đã lấy thông tin từ đâu?
Gần đây tôi đã nghe nói về GCC Atomic-builtin. Tôi có thể sử dụng chúng để làm cho cờ của tôi đọc/ghi nguyên tử mà không cần phải sử dụng mutexes không? Sự khác biệt là gì? Tôi hiểu các nội trang Atomic sôi xuống mã máy, nhưng ngay cả các mutex cũng có thể làm hỏng các chỉ lệnh rào cản bộ nhớ của CPU phải không? Tại sao mọi người gọi mutex là cấu trúc "cấp độ hệ điều hành"?
Tôi có cần phải bảo vệ mutex std :: vector của mình không? Hãy nhớ lại rằng chuỗi công nhân điền vào vectơ này, trong khi cha mẹ chỉ gọi rỗng() trên nó (tức là chỉ đọc nó)
Tôi không tin rằng bảo vệ mutex là cần thiết cho bool hoặc vector. Tôi hợp lý hóa như sau, "Ok, nếu tôi đọc bộ nhớ chia sẻ ngay trước khi nó được cập nhật .. thats vẫn còn tốt, tôi sẽ nhận được giá trị cập nhật trong thời gian tới. Quan trọng hơn, tôi không thấy lý do tại sao các nhà văn nên bị chặn trong khi đọc là đọc, bởi vì sau đó, người đọc chỉ đọc! "
Nếu ai đó có thể chỉ cho tôi đúng hướng, điều đó thật tuyệt vời. Tôi đang sử dụng GCC 4.3 và Intel x86 32 bit. Cảm ơn rất nhiều!
Liên quan đến 'bool', anh ấy chắc chắn cần điều gì đó để đảm bảo rằng quyền truy cập thực sự diễn ra khi anh ấy nghĩ. Nếu anh ta có một trình biên dịch hỗ trợ 'std :: atomic <>', thì điều đó là đủ; nếu không, anh ta cần hoặc một số loại cơ chế đồng bộ hóa, hoặc một số phương tiện khác để đảm bảo rằng các hàng rào cần thiết, vv có mặt. –
Cũng lưu ý rằng 'std :: vector' có thể di chuyển nội dung của nó từ dưới chân của bạn khi nó cần phải phân bổ lại cho bộ đệm lớn hơn. Tại thời điểm này người tiêu dùng có thể đọc bộ nhớ 'xóa'-ed. –
@Maxim: Tôi cần làm rõ, theo các hoạt động hướng dẫn sử dụng của Intel trên bools vốn đã nguyên tử, nhưng bạn nói trong câu trả lời đầu tiên của bạn rằng "một lệnh nguyên tử sẽ làm". Bạn có mâu thuẫn không? Hoặc, bạn đang nói rằng tôi nên được ở bên an toàn và sử dụng một builtin nguyên tử incase mã của tôi bao giờ chạy trên một hệ thống không phải của Intel? – Kostolma