2015-08-20 16 views
5

Sto scrivendo i binding Java per una libreria C, e quindi lavoro con JNI. Oracle specifies, ragionevolmente, che le librerie native da utilizzare con Java dovrebbero essere compilate con compilatori a conoscenza multipla.Cosa fa veramente gcc -D_REENTRANT?

La documentazione JNI dare l'esempio specifico che per gcc, questo requisito multithread-consapevolezza dovrebbe essere raggiunto attraverso la definizione di una delle macro _REENTRANT o _POSIX_C_SOURCE. Mi sembra strano. _REENTRANT e _POSIX_C_SOURCE sono macro di test delle funzionalità. La documentazione GCC e POSIX descrive i loro effetti in termini di definizione di simboli e rendendo visibili le dichiarazioni, proprio come mi aspetterei per qualsiasi macro di test delle funzionalità.

Se non ho bisogno di simboli o funzioni aggiuntive, allora questi macro di fatto fanno qualcosa di utile per me? Uno o entrambi causano gcc per generare codice diverso da quello altrimenti? Forse causano il collegamento delle chiamate del mio codice alle funzioni della libreria standard con diverse implementazioni? O l'oracolo sta parlando solo delle sue regioni basse?

Modifica: Inoltre, mi viene in mente che la rientranza è una considerazione separata dal threading. La non-reentrancy può essere un problema anche per i programmi a thread singolo, quindi il suggerimento di Oracle che la definizione di _REENTRANT rende compatibile con multithread gcc sembra ancora più dubbio.

+2

Niente affatto. È un cruft legacy al 100% dai primi sistemi che non erano thread-safe senza definire una macro speciale. (E hanno usato male la parola "rientrante" per significare thread-safe.) –

risposta

2

La raccomandazione Oracle è stata scritta per Solaris, non per Linux.

Su Solaris, se è stato compilato un .so senza _REENTRANT e finito caricato da un'applicazione multithreading, potrebbero accadere cose molto brutte (ad esempio danneggiamento casuale dei dati interni di libc). Questo perché senza la definizione hai finito con varianti sbloccate di alcune routine di default.

Questo è stato il caso in cui ho letto per la prima volta questa documentazione, che era forse 15 anni fa, la menzione del flag -mt per il compilatore di Sun Studio è stata aggiunta dopo l'ultima lettura di questo documento in ogni dettaglio.

Questo non è più il caso: si ottiene sempre la stessa routine ora indipendentemente dal fatto che si compili o meno con il flag _REENTRANT; ora è solo una macro caratteristica e non una macro comportamentale.

+0

Grazie, era proprio quello che volevo sapere. –