Derlerken -pthread bayrağının önemi


143

Çeşitli çok iş parçacıklı C ve C ++ projelerinde -pthreadbayrağın hem derleme hem de bağlama aşamasına uygulandığını gördüm, diğerleri ise hiç kullanmıyor ve sadece -lpthreadbağlantı aşamasına geçiyor .

-pthreadBayrağa derlenip bağlantı kurmama tehlikesi var mı -pthread? Yani aslında ne işe yarar? Öncelikle Linux platformlarıyla ilgileniyorum.

Yanıtlar:


107

Deneyin:

gcc -dumpspecs | grep pthread

ve ile başlayan her şeyi arayın %{pthread:.

Bilgisayarımda bu, dosyaların derlenmesine -D_REENTRANTve bağlantı kurulmasına neden oluyor -lpthread. Diğer platformlarda bu farklılık gösterebilir. -pthreadÇoğu taşınabilirlik için kullanın .

Kullanılması _REENTRANT, GNU C üzerinde, bazı libc başlıklar çalışma biçimini değiştirir. Belirli bir örnek olarak, errnoiş parçacığı yerel bir konum döndüren bir işlevi çağırır.


3
Genelde sadece errnove önişleme olmayabilir . Hpl.hp.com/techreports/2004/HPL-2004-209.pdf makalesinin gcc optimizasyonları için ne kadar alakalı olduğundan emin değilim , ancak orada incelemenin derinliğinden etkilendim.
Pascal Cuoq

2
Errno örneğinin doğru olduğunu düşünmüyorum. -Pthread bayrağı veya _REENTRANT tanımlaması olmasa bile, errno.h (glibc 2.10.1) ve gcc (amd64 üzerinde 4.4.1), errno işleme için dinamik bir çağrı oluşturur ve sembol adresine bağlanmaz.
Andy Ross

1
@Pascal: Bağlantı için teşekkürler. Şu anda kafamın biraz üstüne çıkıyor, ancak ana nokta, diş açmanın sadece "tacklenemeyeceği", bunun yerine bellek modelinin bir parçası olarak tasarlanması gerektiği gibi görünüyor. Buna tamamen katılıyorum.
Chris Jester-Young

2
@Andy - gcc sürümünüz sağlamak -D_REENTRANTveya -pthreadotomatik olarak oluşturulabilir. Derlemenizi çalıştırdığınızda g++ -v, derleyicinin ön ucunun gerçekte hangi parametrelere geçtiği hakkında çok fazla çıkış yapar cc1plusve ld.
Tom

3
Burada hala cevaplanmayan bir soru var: -pthread bayrağını derlememek ve bağlantı kurmakla ilgili bir tehlike var mı?
natenho

40

Gönderen man gcc:

-pthread pthreads kütüphanesi ile çoklu kullanım desteği ekler. Bu seçenek, hem önişlemci hem de bağlayıcı için bayrakları ayarlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.