2012-08-23 8 views
5

Tôi đang cố gắng chuyển một số mã tôi đã viết từ Mac OS X sang Linux và đang cố gắng tìm một sự thay thế phù hợp cho OSX chỉ OSAtomic.h. Tôi tìm thấy gcc __sync* gia đình, nhưng tôi không chắc chắn nó sẽ tương thích với trình biên dịch cũ/hạt nhân tôi có. Tôi cần mã để chạy trên GCC v4.1.2 và kernel 2.6.18.Hoạt động nguyên tử trong C trên Linux

Các hoạt động cụ thể tôi cần là:

  • Tăng
  • Decrement
  • Hãy so sánh và Swap

gì là lạ là chạy locate stdatomic.h trên máy linux tìm thấy các tập tin tiêu đề (trong thư mục C++), trong khi chạy lệnh tương tự trên máy OSX của tôi (gcc v4.6.3) không trả về gì cả. Tôi phải cài đặt gì để có được thư viện stdatomic, và nó có hoạt động với gcc v 4.1.2 không?

Lưu ý phụ, tôi không thể sử dụng bất kỳ thư viện của bên thứ ba nào.

+1

Nội trang nguyên tử GCC được ghi lại như một phần của [4.1.1] (http://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Atomic-Builtins.html). – jxh

+0

Tương tự cho tăng và tìm nạp và không yêu cầu phiên bản GCC: http://stackoverflow.com/questions/2353371/atomic-increment-fetch –

Trả lời

5

Vâng, không có gì để ngăn bạn sử dụng các hoạt động OSAtomic trên các nền tảng khác. Các nguồn cho các hoạt động OSAtomic cho ARM, x86 và PPC là một phần của libc của Apple là mã nguồn mở. Chỉ cần chắc chắn rằng bạn không sử dụng OSSpinLock vì đó là cụ thể cho Mac OS X, nhưng điều này có thể dễ dàng thay thế bằng Linux futexes.

Xem những:

http://opensource.apple.com/source/Libc/Libc-594.1.4/i386/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/ppc/sys/OSAtomic.s http://opensource.apple.com/source/Libc/Libc-594.1.4/arm/sys/OSAtomic.s

Ngoài ra, bạn có thể sử dụng gia đình sync_*, mà tôi tin rằng sẽ làm việc trên hầu hết các nền tảng, mà tôi tin được mô tả ở đây: http://gcc.gnu.org/wiki/Atomic

5

Các OpenPA project cung cấp một thư viện di động của các hoạt động nguyên tử theo một giấy phép theo phong cách MIT. Đây là một trong những tôi đã sử dụng trước đây và nó là khá đơn giản. Mã cho hoạt động của bạn sẽ trông như thế

#include "opa_primitives.h" 

OPA_int_t my_atomic_int = OPA_INT_T_INITIALIZER(0); 

/* increment */ 
OPA_incr_int(&my_atomic_int); 

/* decrement */ 
OPA_decr_int(&my_atomic_int); 

/* compare and swap */ 
old = OPA_cas_int(&my_atomic_int, expected, new); 

Nó cũng chứa các rào cản bộ nhớ hạt mịn (ví dụ: đọc, viết, và đọc/ghi) thay vì chỉ một hàng rào bộ nhớ đầy.

main header file có nhận xét hiển thị các hoạt động có sẵn trong thư viện.

4

Nội tại nguyên tử GCC đã có sẵn từ GCC 4.0.1.

Không có gì ngăn bạn xây dựng GCC 4.7 hoặc Clang bằng GCC 4.1.2 và sau đó nhận tất cả các tính năng mới hơn như C11 atomics.

Có nhiều vị trí bạn có thể tìm thấy việc triển khai lắp ráp được cấp phép BSD của nguyên tử làm phương sách cuối cùng.