PTHREAD_MUTEX_INITIALIZER เทียบกับ pthread_mutex_init (& mutex, param)


92

มีความแตกต่างระหว่าง

หรือ

ฉันปลอดภัยเพียงพอหรือไม่หากใช้เพียงวิธีแรก

หมายเหตุ:คำถามของฉันส่วนใหญ่หมายถึงโปรแกรมขนาดเล็กมากซึ่งสิ่งที่ฉันจะทำมากที่สุดคือเชื่อมต่อไคลเอนต์หลายรายเข้ากับเซิร์ฟเวอร์และแก้ไขข้อสงสัยด้วยเธรดของผู้ปฏิบัติงาน

คำตอบ:


75

ตามมาตรฐาน POSIX เวอร์ชันเก่าจะรับประกันว่าวิธีแรกที่มีตัวเริ่มต้นจะทำงานกับตัวแปรที่จัดสรรแบบคงที่เท่านั้นไม่ใช่เมื่อตัวแปรเป็นautoตัวแปรที่กำหนดไว้ในเนื้อความของฟังก์ชัน แม้ว่าฉันจะไม่เคยเห็นแพลตฟอร์มที่จะไม่ได้รับอนุญาตแม้กระทั่งสำหรับautoตัวแปรและข้อ จำกัด นี้ได้ถูกลบออกในมาตรฐาน POSIX เวอร์ชันล่าสุด

staticตัวแปรที่เป็นที่นิยมจริงๆถ้าคุณอาจจะเพราะมันจะช่วยให้การเขียนรหัสบูตง่ายมาก เมื่อใดก็ตามที่คุณป้อนรหัสที่ใช้ mutex ดังกล่าวในเวลาทำงานคุณสามารถมั่นใจได้ว่า mutex ได้รับการเริ่มต้นแล้ว นี่เป็นข้อมูลที่มีค่าในบริบทแบบมัลติเธรด

วิธีการที่ใช้ฟังก์ชัน init จะดีกว่าเมื่อคุณต้องการคุณสมบัติพิเศษสำหรับ mutex ของคุณเช่นการเรียกซ้ำเช่นหรือการแชร์ระหว่างโปรเซสไม่ใช่เฉพาะระหว่างเธรดเท่านั้น


8

คุณสามารถตั้งค่าแอตทริบิวต์เพิ่มเติมของ mutex ได้ด้วยการเริ่มต้นแบบไดนามิกและคุณสามารถใช้วิธีไดนามิกได้ก็ต่อเมื่อคุณเพิ่ม mutexes จำนวนมากในขณะรันไทม์

ไม่มีอะไรผิดปกติกับวิธีการคงที่ถ้ามันเหมาะกับความต้องการของคุณ


" และคุณสามารถใช้วิธีไดนามิกได้ก็ต่อเมื่อคุณเพิ่ม mutexes จำนวนมากในขณะรัน " แล้วนี่หมายความว่าอย่างไร ตัวอย่างเล็ก ๆ น้อย ๆ ถ้าอธิบายไม่ยาก?
Kalec

1
@Kalec: ถ้า mutex ของคุณถูกจัดสรรโดยmalloc()(หรือเป็นของวัตถุที่จัดสรร)
Michael Burr

3
@Kalec ถ้าตัวแปร mutex "lock" เป็นส่วนหนึ่งของโครงสร้างเราจะไม่สามารถปฏิบัติตามแนวทางที่ 1 ได้ เราต้องใช้ pthread_init ()
pankaj kushwaha

8

ฉันต้องการอ้างจากหนังสือเล่มนี้:

ด้วยPOSIXเธรดมีสองวิธีในการเริ่มต้นการล็อก วิธีหนึ่งที่ทำได้คือใช้PTHREAD_MUTEX_INITIALIZERดังนี้: pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

เพื่อตั้งค่าการล็อกเป็นค่าเริ่มต้นและทำให้ล็อคใช้งานได้ วิธีการทำแบบไดนามิก (กล่าวคือในขณะทำงาน) คือการโทรไปpthread_mutex_init()ดังต่อไปนี้: int rc = pthread_mutex_init(&lock, NULL); assert(rc == 0); // always check success!

อาร์กิวเมนต์แรกของรูทีนนี้คือแอดเดรสของตัวล็อกในขณะที่อันที่สองคือชุดแอ็ตทริบิวต์ที่เป็นทางเลือก อ่านเพิ่มเติมเกี่ยวกับคุณลักษณะด้วยตัวคุณเอง การผ่าน NULL เพียงแค่ใช้ค่าเริ่มต้น ไม่ว่าจะเป็นวิธีใดก็ตาม แต่เรามักจะใช้วิธีไดนามิก (หลัง)


5

ในกรณีที่แอตทริบิวต์ mutex ดีฟอลต์เหมาะสมสามารถใช้มาโคร PTHREAD_MUTEX_INITIALIZER เพื่อเตรียมใช้งาน mutexes

หากคุณต้องการระบุแอตทริบิวต์สำหรับ mutex ให้ใช้การเริ่มต้นแบบไดนามิก ........

เอฟเฟกต์จะเทียบเท่ากับการกำหนดค่าเริ่มต้นแบบไดนามิกโดยการเรียกใช้ pthread_mutex_init () โดยระบุพารามิเตอร์เป็น NULL ยกเว้นว่าจะไม่มีการตรวจสอบข้อผิดพลาด

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