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