Đây có phải là cách triển khai chính xác cho chức năng hoán đổi nguyên tử chung không? Tôi đang tìm một giải pháp tương thích C++ 03 trên GCC.Chức năng hoán đổi nguyên tử sử dụng gcc nguyên tử dựng sẵn
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
T * ptr = &a;
b =__sync_lock_test_and_set(ptr, b);
__sync_lock_release(&ptr);
}
Nếu không, tôi nên làm gì để khắc phục sự cố?
Ngoài ra: là __sync_lock_release
luôn cần thiết? Khi tìm kiếm thông qua các codebases khác tôi thấy rằng điều này thường không được gọi. Nếu không có việc phát hành gọi mã của tôi trông như thế này:
template<typename T>
void atomic_swap(T & a, T & b) {
static_assert(sizeof(T) <= sizeof(void*), "Maximum size type exceeded.");
b = __sync_lock_test_and_set(&a, b);
}
PS: Atomic swap in GNU C++ là một câu hỏi tương tự nhưng nó không trả lời câu hỏi của tôi vì câu trả lời cung cấp đòi hỏi C++ 11 của std::atomic
và nó có chữ ký Data *swap_data(Data *new_data)
đó doesn' t dường như có ý nghĩa ở tất cả cho một hàm swap
. (Nó thực sự hoán đổi đối số được cung cấp với một biến toàn cục đã được xác định trước hàm.)
Dường như chỉ truy cập vào 'a' được cho là nguyên tử? –
Tại sao lại phát minh ra bánh xe? Xem http://concurrencykit.org/ –
@BenVoigt Bài đăng đó không đưa ra câu trả lời rõ ràng. Và nó hoán đổi đối số với biến toàn cục. – StackedCrooked