Tôi đang viết các ràng buộc Java cho một thư viện C, và do đó làm việc với JNI. Oracle specifies, một cách hợp lý, các thư viện gốc để sử dụng với Java sẽ được biên dịch với các trình biên dịch nhận biết đa luồng.Gcc -D_REENTRANT thực sự làm gì?
Tài liệu JNI cung cấp ví dụ cụ thể cho gcc
, yêu cầu nhận thức đa luồng này phải được đáp ứng bằng cách xác định một trong các macro _REENTRANT
hoặc _POSIX_C_SOURCE
. Điều đó có vẻ kỳ lạ với tôi. _REENTRANT
và _POSIX_C_SOURCE
là các macro thử nghiệm tính năng. Tài liệu GCC và POSIX mô tả các hiệu ứng của chúng trong việc xác định các ký hiệu và làm cho các khai báo hiển thị, giống như tôi mong đợi đối với bất kỳ macro thử nghiệm tính năng nào.
Nếu tôi không cần các biểu tượng hoặc chức năng bổ sung, thì những macro này có thực sự hữu ích cho tôi không? Có một hoặc cả hai nguyên nhân gây ra gcc
để tạo mã khác với cách khác không? Họ có thể khiến các lệnh gọi mã của tôi thành các hàm thư viện chuẩn được liên kết với các triển khai khác nhau không? Hoặc là Oracle chỉ nói ra khỏi các khu vực của nó?
Chỉnh sửa: Ngoài ra, nó xảy ra với tôi rằng reentrancy là một xem xét riêng biệt từ luồng. Non-reentrancy có thể là một vấn đề ngay cả đối với các chương trình đơn luồng, do đó đề xuất của Oracle xác định _REENTRANT
làm cho gcc
nhận biết đa luồng bây giờ có vẻ còn đáng ngờ hơn.
Không có gì cả. Đó là 100% di sản cruft từ các hệ thống ban đầu mà không được thread-an toàn mà không cần xác định một vĩ mô đặc biệt. (Và họ lạm dụng từ "reentrant" để có nghĩa là an toàn chỉ.) –