2015-08-20 17 views
5

Bir C kitaplığı için Java ciltleme yazıyorum ve bu nedenle JNI ile çalışıyorum. Oracle specifies, mantıksal olarak, Java ile kullanım için yerel kitaplıkların, çoklu-tanıma gerektiren derleyicilerle derlenmesi gerekir. gcc -D_REENTRANT gerçekten ne yapar?

JNI docs

gcc için, bu çoklu işlemli-farkındalık gereksinimi makrolar _REENTRANT veya _POSIX_C_SOURCE birini tanımlayan tarafından karşılanması gerektiğini somut bir örnek verebilir. Bu bana tuhaf geliyor. _REENTRANT ve _POSIX_C_SOURCE özellik test makrolarıdır. GCC ve POSIX belgeleri, herhangi bir özellik testi makrosu için beklediğim gibi, sembollerin tanımlanması ve beyanların görünür hale getirilmesi açısından etkilerini açıklar.

Ek sembollere veya işlevlere ihtiyacım yoksa, bu makroları aslında benim için yararlı bir şey yapalım mı? Aksi takdirde farklı bir kod üretmek için gcc neden mi? Kodumun standart kitaplık işlevlerine farklı uygulamalarla bağlantılı olarak çağrılmasına neden olabilirler mi? Yoksa Oracle sadece onun net bölgelerinden mi konuşuyor?

Düzenleme: Ek olarak, yinelemenin iş parçacığından ayrı bir şekilde ele alınması bana göre oluşur. Tek-iş parçacıklı olmayan programlar için bile reentransızlık bir sorun olabilir, bu yüzden Oracle'ın _REENTRANT'u tanımlamanın önerisi, gcc'u multithread-aware ile artık daha da şüpheli görünüyor.

+2

Hiç bir şey yok. Özel bir makronun tanımlanmasına gerek kalmadan, dişli sistemli olmayan, erken sistemlerden% 100 eski bir araç. (Ve "reentrant" kelimesini "thread-safe" kelimesiyle karıştırdılar.) –

cevap

2

Oracle'ın önerisi Linux için değil, Solaris için yazılmıştır.

Solaris'te, _REENTRANT olmadan bir .so derlediyseniz ve çok iş parçacıklı bir uygulama tarafından yüklendiyseniz, çok kötü şeyler oluşabilir (örneğin, libc internals'ın rastgele veri bozulması). Bunun nedeni, tanımsız olarak, bazı rutinlerin kilitli varyantlarını varsayılan olarak tamamlamanızdır. Bu belgeyi ilk okuduğumda, 15 yıl öncesine dayanan bu durum, bu belgeyi her detayda okuduğumdan sonra, güneş stüdyosu derleyicisi için -mt bayrağının eklenmesi durumunun söz konusu olduğu durum için geçerlidir.

Bu artık geçerli değil - _REENTRANT bayrağını derleyip derlemediğinizde, şimdi hep aynı rutini alıyorsunuz; Artık sadece bir özellik makrosu ve bir davranış makrosu değil.

+0

Teşekkürler, bilmek istediğim buydu. –