ความสำคัญของแฟล็ก -pthread เมื่อรวบรวม


143

ในโปรเจ็กต์ C และ C ++ แบบมัลติเธรดที่หลากหลายฉันได้เห็นการ-pthreadตั้งค่าสถานะที่ใช้กับทั้งการคอมไพล์และการเชื่อมโยงสเตจในขณะที่คนอื่นไม่ได้ใช้เลยและผ่าน-lpthreadไปยังสเตจลิงก์

มีอันตรายใดบ้างที่ไม่ได้รวบรวมและเชื่อมโยงกับ-pthreadธง - นั่นคือสิ่งที่จะ-pthreadทำจริง ๆ ? ฉันสนใจแพลตฟอร์ม Linux เป็นหลัก

คำตอบ:


107

ลอง:

gcc -dumpspecs | grep pthread

%{pthread:และมองหาสิ่งที่เริ่มต้นด้วย

บนคอมพิวเตอร์ของฉันนี้จะทำให้ไฟล์ที่จะรวบรวมกับและเชื่อมโยงกับ-D_REENTRANT -lpthreadบนแพลตฟอร์มอื่น ๆ สิ่งนี้อาจแตกต่างกัน ใช้-pthreadสำหรับพกพาส่วนใหญ่

การใช้_REENTRANTบน GNU libc จะเปลี่ยนวิธีการทำงานของส่วนหัว libc เป็นตัวอย่างเฉพาะทำให้การerrnoเรียกฟังก์ชันส่งคืนตำแหน่งเธรดโลคัล


3
มันอาจจะไม่ใช่แค่errnoและ preprocessing โดยทั่วไป ฉันไม่แน่ใจว่าบทความhpl.hp.com/techreports/2004/HPL-2004-209.pdfนั้นมีความเกี่ยวข้องกับการเพิ่มประสิทธิภาพ gcc หรือไม่ แต่ฉันแน่ใจว่าประทับใจในความลึกของการตรวจสอบที่นั่น
Pascal Cuoq

2
ฉันไม่คิดว่าตัวอย่างผิดพลาดนั้นถูกต้อง แม้จะไม่มีแฟล็ก -pthread หรือ _REENTRANT define, errno.h ของฉัน (glibc 2.10.1) และ gcc (4.4.1 on amd64) สร้างการเรียกแบบไดนามิกสำหรับการจัดการ errno และไม่เชื่อมโยงกับที่อยู่สัญลักษณ์
Andy Ross

1
@Pascal: ขอบคุณสำหรับลิงค์ มันไปเหนือหัวของฉันเล็กน้อยในขณะนี้ แต่ดูเหมือนว่าจุดศูนย์กลางคือการทำเกลียวไม่สามารถ "ถูกยึดติด" ได้ แต่จะต้องได้รับการออกแบบให้เป็นส่วนหนึ่งของโมเดลหน่วยความจำแทน ฉันเห็นด้วยอย่างยิ่งกับสิ่งนั้น
Chris Jester-Young

2
@Andy - gcc รุ่นของคุณอาจถูกสร้างขึ้นเพื่อให้-D_REENTRANTหรือ-pthreadโดยอัตโนมัติ เรียกการสร้างของคุณด้วยg++ -vและมันจะถ่ายโอนข้อมูลจำนวนมากของการส่งออกเกี่ยวกับสิ่งที่พารามิเตอร์คอมไพเลอร์ front-end เป็นจริงผ่านไปและcc1plus ld
Tom

3
ยังคงมีคำถามที่ไม่ตอบคำถามที่นี่: มีอันตรายใด ๆ ที่ไม่ได้รวบรวมและเชื่อมโยงกับแฟล็ก -pthread - เช่นอะไร - -pthread ทำอะไรจริง ๆ ?
natenho

40

จากman gcc:

-pthread เพิ่มการสนับสนุนสำหรับมัลติเธรดด้วยไลบรารี pthreads ตัวเลือกนี้จะตั้งค่าสถานะสำหรับทั้งตัวประมวลผลล่วงหน้าและตัวเชื่อมโยง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.