Tôi muốn xác minh rằng sự hiểu biết của tôi là chính xác. Loại điều này là khó khăn vì vậy tôi gần như chắc chắn tôi đang thiếu một cái gì đó. Tôi có một chương trình bao gồm một chuỗi thời gian thực và một chuỗi không theo thời gian thực. Tôi muốn các chủ đề không RT để có thể trao đổi một con trỏ đến bộ nhớ được sử dụng bởi các chủ đề RT.Hoán đổi nguyên tử trong GNU C++
Từ các tài liệu, hiểu biết của tôi là điều này có thể được thực hiện trong g++
với:
// global
Data *rt_data;
Data *swap_data(Data *new_data)
{
#ifdef __GNUC__
// Atomic pointer swap.
Data *old_d = __sync_lock_test_and_set(&rt_data, new_data);
#else
// Non-atomic, cross your fingers.
Data *old_d = rt_data;
rt_data = new_data;
#endif
return old_d;
}
Đây là nơi duy nhất trong chương trình (trừ thiết lập ban đầu), nơi rt_data
được sửa đổi. Khi rt_data
được sử dụng trong ngữ cảnh thời gian thực, nó được sao chép vào một con trỏ cục bộ. Đối với old_d
, sau này khi chắc chắn rằng bộ nhớ cũ không được sử dụng, bộ nhớ sẽ được giải phóng trong chuỗi không phải RT. Điều này có đúng không? Tôi có cần volatile
ở bất kỳ đâu không? Có nguyên gốc đồng bộ hóa khác tôi nên gọi?
Bằng cách này tôi đang làm điều này trong C++, mặc dù tôi quan tâm đến việc câu trả lời có khác với C.
Cảm ơn trước.
Cảm ơn bạn! Tôi có thể làm theo đề nghị của bạn về việc sử dụng std :: atomic, điều đó thật tuyệt vời. (Tôi chưa làm quen với các công cụ C++ 0x mới nhất.) Chỉ cần tò mò, nếu tôi sử dụng __sync_lock_test_and_set, hàng rào chính xác để sử dụng khi đọc là gì? (ví dụ: để tạo bản sao cục bộ) – Steve