Piszę wiązania Java dla biblioteki C, a zatem pracuję z JNI. Oracle specifies, rozsądnie, że rodzime biblioteki do użytku z Javą powinny być kompilowane za pomocą kompilatorów wielowątkowych.Co naprawdę robi gcc -D_REENTRANT?
docs JNI podać konkretny przykład, że dla gcc
wymóg ten multithread świadomość powinny być spełnione poprzez zdefiniowanie jednego z makrami _REENTRANT
lub _POSIX_C_SOURCE
. Wydaje mi się to dziwne. _REENTRANT
i _POSIX_C_SOURCE
są makrami testów wydajności. Dokumentacja GCC i POSIX opisuje ich efekty w zakresie definiowania symboli i deklarowania widoczności, tak jak oczekiwałbym w przypadku każdego makra funkcji testowej.
Jeśli nie potrzebuję dodatkowych symboli lub funkcji, to czy te makra rzeczywiście robią dla mnie coś przydatnego? Czy jeden lub oba komponenty powodują wygenerowanie innego kodu, niż w przeciwnym razie? Czy mogą spowodować, że wywołania mojego kodu do standardowych funkcji bibliotecznych będą powiązane z różnymi implementacjami? A może Oracle po prostu rozmawia ze swoimi dolnymi regionami?
Edytuj: Dodatkowo, zdaję sobie sprawę, że przywiązanie jest oddzielną kwestią związaną z gwintowaniem. Brak przywracania może być problemem nawet w przypadku programów jednowątkowych, więc sugestia firmy Oracle, że definiowanie wielowątkowych wartości _REENTRANT
wydaje się jeszcze bardziej wątpliwe.
Nic w ogóle. Jest to w 100% starsza wersja od wczesnych systemów, które nie były bezpieczne dla wątków bez definiowania specjalnego makra. (I źle wykorzystali słowo "reentrant", aby w ten sposób określić wątek bezpieczny). –