Mutex Programming
การจัดจังหวะการทำงานของเทรด (Thread Synchronization)
Mutex lock (MUTual EXclusion lock) เป็น Semaphore อย่างง่ายที่นำมาใช้ในการจัดการ Mutual Exclusion กับทรัพยากรที่ถูกใช้งานร่วมกันได้อย่างมีประสิทธิภาพโดยเฉพาะกับ thread โดย Mutex จะเป็นตัวแปรที่มีได้ 2 สถานะ คือ สถานะปลดล็อค (unlock
) หรือ สถานะล็อค (lock
) ซึ่งใช้เพียง 1 บิต (1-bit) ที่แสดงสถานะของมัน แต่ในทางปฏิบัติเราใช้ตัวแปรจำนวนเต็ม (integer) โดยให้สถานะ unlocked
เป็นเลขศูนย์ และสถานะ lock
จะใช้เลขอื่นแทน
นักพัฒนาสามารถพัฒนาโปรแกรมโดยเรียกใช้ความสามารถในการจัดกลไกการทำงานประสานกันระหว่างเทรด (synchronization mechanisms) โดยไม่ให้เกิดปัญหาในกรณีที่เทรดแต่ละตัวจะต้องเข้าไปใช้ทรัพยากรตัวเดียวกัน ภายในเครื่องคอมพิวเตอร์เดียวกันโดยใช้ไลบรารี pthread ซึ่งจากรูปด้านบนแสดงการอนุญาตเพียง thread #1 ตัวเดียวที่สามารถเข้าไปกำหนดค่า mutex (Mutual Exclusion Lock) เพื่อเข้าถึงทรัพยากรหรือตัวแปร โดยที่ thread #2 จะต้องรอ (block) คิวเพื่อเข้าถึงทรัพยากรหรือตัวแปรหลังจากที่ thread #1 ทำงานเสร็จเรียบร้อยแล้ว ตัว thread #2 จึงจะสามารถเข้าไปกำหนดค่า mutex เพื่อขอเข้าถึงทรัพยากรหรือตัวแปรนั้นต่อไป
แต่อย่างไรก็ตามการใช้ mutex จะถูกใช้ได้เพียงในกรณีมีหลายเทรดในโปรเซสตัวเดียวกันเท่านั้น แต่ในกรณีที่มีหลายโปรเซสต้องการเข้าใช้ทรัพยากรเดียวกัน จะต้องแก้ไขโดยการใช้เทคนิค semaphore แทน mutex ซึ่งจะกล่าวในหัวข้อ 6.2.3 ต่อไป
ฟังก์ชันที่เกี่ยวข้องสำหรับ mutex ภายในไลบรารี pthread
ได้แก่
pthread_mutex_lock()
ใช้สำหรับการเข้าไปล็อคค่าในตัวแปร mutex การเรียกฟังก์ชันนี้ก็จะถูกบล๊อคเอาไว้ไม่ให้เทรดอื่นเข้ามา จนกว่าเทรดตัวที่ใช้งานอยู่ทำการปล่อยตัว mutex เท่านั้นpthread_mutex_unlock()
เพื่อปล่อยหรือปลดล็อคค่าmutex
จากเทรดที่ใช้mutex
อยู่pthread_mutex_trylock()
เพื่อใช้ตรวจสอบตัวแปรmutex
ว่ากำลังถูกใช้ล๊อคใช้งานอยู่หรือไม่ ซึ่งจะมีประโยชน์ในการป้องกันไม่ให้เกิดเหตุการณ์ที่เทรดแต่ละตัวต่างฝ่ายต่างรอให้แต่ละตัวเสร็จ (deadlock conditions)
ตัวอย่างแสดงการสร้างเทรดจำนวน 10 เทรด โดยแต่ละตัวจะเข้าไปใช้งานตัวแปรกลางชื่อว่า counter แต่จะต้องเพิ่มค่า counter ได้เพียงครั้งละ 1 เทรดเท่านั้น
คอมไพล์ และทดสอบรันโปรแกรม
Last updated