2015-08-20 15 views
5

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_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.

+2

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ỉ.) –

Trả lời

2

Đề xuất của Oracle được viết cho Solaris, không dành cho Linux.

Trên Solaris, nếu bạn đã biên dịch .so mà không cần _REENTRANT và kết thúc tải bởi ứng dụng đa luồng thì những điều rất xấu có thể xảy ra (ví dụ: tham nhũng dữ liệu ngẫu nhiên của nội bộ libc). Điều này là do không có định nghĩa bạn đã kết thúc với các biến thể mở khóa của một số thói quen theo mặc định.

Đây là trường hợp đầu tiên tôi đọc tài liệu này, có thể cách đây 15 năm, đề cập đến cờ -mt cho trình biên dịch phòng thu mặt trời đã được thêm vào sau khi tôi đọc tài liệu này lần cuối.

Điều này không còn là trường hợp - Bạn luôn nhận được cùng một quy trình ngay bây giờ cho dù bạn có biên dịch với cờ _REENTRANT hay không; bây giờ nó chỉ là một macro tính năng chứ không phải macro hành vi.

+0

Cảm ơn, đó chỉ là những gì tôi muốn biết. –

Các vấn đề liên quan