2015-08-20 18 views
5

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.

+2

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

Odpowiedz

2

Rekomendacja Oracle została napisana dla systemu Solaris, a nie dla systemu Linux.

W systemie Solaris kompilacja .so bez _REENTRANT i zakończona ładowaniem przez aplikację wielowątkową może spowodować bardzo złe rzeczy (np. Przypadkowe uszkodzenie danych wewnętrznych bibliotek libc). Stało się tak dlatego, że bez zdefiniowania domyślnie otrzymałeś odblokowane warianty niektórych procedur.

Tak było w przypadku, gdy po raz pierwszy przeczytałem tę dokumentację, która była może 15 lat temu, wzmianka o flagę -mt dla kompilatora sun studio została dodana po ostatnim przeczytaniu tego dokumentu w każdym szczególe.

To już nie ma miejsca - zawsze otrzymujesz tę samą procedurę, niezależnie od tego, czy kompilujesz się z flagą _REENTRANT; jest to teraz tylko makro funkcji, a nie makro zachowania.

+0

Dziękuję, to było to, co chciałem wiedzieć. –