Nếu tôi có một int duy nhất mà tôi muốn viết từ một chủ đề và đọc từ một chủ đề khác, tôi cần sử dụng std::atomic
, để đảm bảo rằng giá trị của nó là nhất quán trên lõi, bất kể có hướng dẫn đọc hay không viết cho nó là khái niệm nguyên tử. Nếu không, có thể là lõi đọc có giá trị cũ trong bộ nhớ cache của nó và sẽ không thấy giá trị mới. Điều này có ý nghĩa với tôi.Làm thế nào để một mutex đảm bảo giá trị của biến là nhất quán giữa các lõi?
Nếu tôi có một số loại dữ liệu phức tạp không thể đọc/ghi thành nguyên tử, tôi cần phải bảo vệ quyền truy cập vào nó bằng cách sử dụng một số nguyên thủy đồng bộ hóa, chẳng hạn như std::mutex
. Điều này sẽ ngăn chặn các đối tượng nhận được vào (hoặc được đọc từ) một trạng thái không phù hợp. Điều này có ý nghĩa với tôi.
Điều gì không có ý nghĩa đối với tôi là cách mutex giúp trợ giúp về vấn đề bộ nhớ đệm mà nguyên tử giải quyết. Họ dường như chỉ tồn tại để ngăn chặn truy cập đồng thời vào một số tài nguyên, nhưng không phải để truyền bá bất kỳ giá trị nào chứa trong tài nguyên đó tới bộ nhớ cache của lõi khác. Có một phần nào đó trong ngữ nghĩa của họ mà tôi đã bỏ lỡ mà giao dịch với điều này?
Tôi không nhận được những gì bạn không nhận được. Nguyên tử có ngữ nghĩa [khóa toàn cầu mutex; làm op; mở khóa toàn cầu mutex]. Chỉ cần một số có hỗ trợ nội tại như vậy được thực hiện hoàn toàn và nhanh chóng. –
Chỉ cần FYI - std :: nguyên tử hoạt động với tất cả các loại dữ liệu. Amusingly của nó chỉ không khóa miễn phí nếu nó quá phức tạp - nó rơi trở lại ổ khóa trong trường hợp đó. Xem chức năng thành viên 'is_lock_free()'. Tuy nhiên, bạn vẫn phải cẩn thận nếu bạn làm điều này thay vì khóa. –
Balog, tôi hiểu ngữ nghĩa của mutexes, và tôi hiểu cách nguyên tử làm những gì họ làm, và tôi hiểu rằng trong C++ 11 họ chính thức có thêm ngữ nghĩa ngăn các lõi khác nhau giữ các giá trị cũ trong bộ đệm. Những gì tôi không hiểu là làm thế nào mutexes làm điều đó. Chúng ngăn chặn truy cập đồng thời vào một thứ, nhưng tôi đã không đọc bất cứ điều gì nói rằng điều đó sẽ có giá trị nhất quán trong bộ nhớ cache của các lõi khác nhau. –