Signifikansi flag -pthread saat kompilasi

143

Dalam berbagai proyek multi-threaded C dan C ++ saya telah melihat -pthreadbendera diterapkan untuk tahap kompilasi dan menghubungkan sementara yang lain tidak menggunakannya sama sekali dan hanya lolos -lpthreadke tahap menghubungkan.

Apakah ada bahaya tidak mengkompilasi dan menghubungkan dengan -pthreadbendera - yaitu apa yang -pthreadsebenarnya dilakukan? Saya terutama tertarik pada platform Linux.

leeeroy
sumber

Jawaban:

107

Mencoba:

gcc -dumpspecs | grep pthread

dan mencari apa pun yang dimulai dengan %{pthread:.

Di komputer saya, ini menyebabkan file dikompilasi -D_REENTRANT, dan dihubungkan dengan -lpthread. Pada platform lain, ini bisa berbeda. Gunakan -pthreaduntuk portabilitas yang paling.

Menggunakan _REENTRANT, pada GNU libc, mengubah cara beberapa header libc bekerja. Sebagai contoh spesifik, itu membuat errnopanggilan fungsi mengembalikan lokasi thread-lokal.

Chris Jester-Young
sumber
3
Mungkin tidak hanya errnodan preprocessing secara umum. Saya tidak yakin seberapa relevan artikel hpl.hp.com/techreports/2004/HPL-2004-209.pdf dalam praktik untuk optimasi gcc, tapi saya yakin terkesan dengan kedalaman ulasan di sana.
Pascal Cuoq
2
Saya tidak berpikir contoh errno benar. Bahkan tanpa flag -pthread atau mendefinisikan _REENTRANT, errno.h saya (glibc 2.10.1) dan gcc (4.4.1 pada amd64) menghasilkan panggilan dinamis untuk penanganan errno dan tidak terhubung dengan alamat simbol.
Andy Ross
1
@ Pascal: Terima kasih atas tautannya. Ini sedikit lebih tinggi dari kepala saya saat ini, tetapi tampaknya titik pusatnya adalah bahwa threading tidak bisa hanya "ditempelkan", tetapi sebaliknya harus dirancang sebagai bagian dari model memori. Saya sepenuhnya setuju dengan itu.
Chris Jester-Young
2
@Andy - versi gcc Anda dapat dibuat untuk menyediakan -D_REENTRANTatau -pthreadsecara otomatis. Jalankan build Anda dengan g++ -vdan itu akan membuang banyak output tentang apa parameter front-end kompiler sebenarnya lewat cc1plusdan ld.
Tom
3
Masih ada pertanyaan yang tidak dijawab di sini: Apakah ada bahaya tidak mengkompilasi dan menghubungkan dengan flag -pthread - yaitu apa yang sebenarnya -pthread lakukan?
natenho
40

Dari man gcc:

-pthread Menambahkan dukungan untuk multithreading dengan pthreads library. Opsi ini menetapkan flag untuk preprocessor dan linker.

Dmitry
sumber