C ++ Mutex ล็อค

C Mutex Lxkh



C ++ เป็นที่รู้จักว่าเป็นหนึ่งในภาษาการเขียนโปรแกรมที่เร็วที่สุดที่มีประสิทธิภาพดี มีความแม่นยำสูง และระบบจัดการหน่วยความจำที่เพียงพอ ภาษาการเขียนโปรแกรมนี้ยังสนับสนุนการทำงานพร้อมกันของหลายเธรดด้วยการแบ่งปันทรัพยากรหลาย ๆ อันระหว่างกัน ในการมัลติเธรด เธรดใช้เพื่อดำเนินการอ่านเท่านั้นซึ่งไม่มีปัญหาเนื่องจากเธรดไม่ได้รับผลกระทบจากสิ่งที่เธรดอื่นทำในขณะนั้น แต่ถ้าเธรดเหล่านี้ต้องแบ่งปันทรัพยากรระหว่างกัน เธรดหนึ่งสามารถแก้ไขข้อมูลในขณะนั้น ซึ่งทำให้เกิดปัญหาได้ เพื่อจัดการกับปัญหานี้ เรามี C++ “Mutex” ซึ่งป้องกันการเข้าถึงทรัพยากรหลายรายการไปยังรหัส/อ็อบเจกต์ของเราโดยจัดให้มีการซิงโครไนซ์ซึ่งระบุว่าการเข้าถึงวัตถุ/รหัสสามารถให้เธรดเดียวเท่านั้นในครั้งเดียว เพื่อไม่ให้หลายเธรดเข้าถึงวัตถุนั้นพร้อมกันได้

ขั้นตอน:

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







ไวยากรณ์:

หากเราต้องการเรียนรู้วิธีใช้งานการล็อก mutex เพื่อป้องกันไม่ให้มีการเข้าถึงหลายเธรดพร้อมกันไปยังอ็อบเจ็กต์หรือโค้ดของเรา เราอาจใช้ไวยากรณ์ต่อไปนี้:



$ std :: mutex mut_x

$mut_x. ล็อค ( ) ;

โมฆะ func_name ( ) {

$ // รหัสที่เราต้องการซ่อนจากหลายเธรดจะถูกเขียนที่นี่

$mut_x. ปลดล็อค ( ) ;

}

ตอนนี้เราจะใช้ไวยากรณ์นี้ในตัวอย่างจำลองและในโค้ดหลอก (ซึ่งเราไม่สามารถเรียกใช้เหมือนในโปรแกรมแก้ไขโค้ดได้) เพื่อแจ้งให้คุณทราบว่าเราจะใช้ไวยากรณ์นี้ได้อย่างไรตามที่กล่าวไว้ในรายการต่อไปนี้:



$ std :: mutex mut_x

โมฆะบล็อก ( ) {

$mut_x. ล็อค ( ) ;

$ std :: ศาล << 'สวัสดี' ;

$mut_x. ปลดล็อค ( ) ;

}

ตัวอย่าง:

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





$ # รวม

$ # รวม

$ # รวม

ไลบรารี 'iostream' มีฟังก์ชันในการแสดงข้อมูลเป็น Cout อ่านข้อมูลเป็น Cin และสิ้นสุดคำสั่งเป็น endl เราใช้ไลบรารี 'เธรด' เพื่อใช้โปรแกรมหรือฟังก์ชันจากเธรด ไลบรารี 'mutex' ช่วยให้เราสามารถใช้ทั้งการล็อก mutex และปลดล็อกในโค้ดได้ เราใช้ '# include' เนื่องจากอนุญาตให้ใช้โปรแกรมทั้งหมดที่เกี่ยวข้องกับไลบรารีที่รวมอยู่ในโค้ด

ตอนนี้ หลังจากทำขั้นตอนก่อนหน้าเสร็จแล้ว เรากำหนดคลาส mutex หรือตัวแปรโกลบอลสำหรับ mutex โดยใช้ std จากนั้น เราสร้างฟังก์ชันสำหรับการล็อกและปลดล็อก mutex ที่เราสามารถเรียกใช้ในภายหลังในโค้ด ในตัวอย่างนี้ เราตั้งชื่อฟังก์ชันนี้เป็นบล็อก ในเนื้อความของฟังก์ชันบล็อก ก่อนอื่นเราเรียก 'mutex.lock()' และเริ่มเขียนตรรกะของโค้ด



mutex.lock() ปฏิเสธการเข้าถึงเธรดอื่น ๆ เพื่อเข้าถึงอ็อบเจ็กต์หรือโค้ดที่เราสร้างขึ้น เพื่อให้เธรดเดียวเท่านั้นที่สามารถอ่านอ็อบเจ็กต์ของเราในครั้งเดียว ในตรรกะ เราเรียกใช้ for loop ที่ทำงานบนดัชนีตั้งแต่ 0 ถึง 9 เราแสดงค่าในลูป เมื่อลอจิกนี้ถูกสร้างขึ้นในการล็อก mutex หลังจากดำเนินการเสร็จสิ้นหรือหลังจากออกจากลอจิกแล้ว เราจะเรียกเมธอด “mutex.unlock()” การเรียกเมธอดนี้ช่วยให้เราสามารถปลดล็อกอ็อบเจ็กต์ที่สร้างขึ้นจากการล็อก mutex เนื่องจากการเข้าถึงออบเจ็กต์ไปยังเธรดเดียวมีให้ก่อนหน้านี้ และเมื่อการดำเนินการกับอ็อบเจ็กต์นั้นเสร็จสิ้นโดยหนึ่งเธรดในคราวเดียว ตอนนี้เราต้องการให้เธรดอื่นๆ เข้าถึงอ็อบเจ็กต์หรือโค้ดนั้นด้วย มิฉะนั้น รหัสของเราจะย้ายในสถานการณ์ 'การหยุดชะงัก' ซึ่งทำให้วัตถุที่สร้างด้วย mutex ยังคงอยู่ในสถานการณ์ที่ถูกล็อกตลอดไป และไม่มีเธรดอื่นใดที่จะสามารถเข้าถึงวัตถุนั้นได้ ดังนั้น การดำเนินการที่ไม่สมบูรณ์ยังคงดำเนินการต่อไป หลังจากนี้เราออกจากฟังก์ชั่นบล็อกและย้ายไปที่หน้าหลัก

ในหลัก เราเพียงแค่แสดง mutex ที่เราสร้างขึ้นโดยการสร้างสามเธรดโดยใช้ “std :: thread thread_name (เรียกฟังก์ชันบล็อกที่สร้างไว้แล้วที่นี่ซึ่งเราสร้าง mutex)” ด้วยชื่อ thread1, thread2 และ thread3 เป็นต้น ด้วยวิธีนี้ สามเธรดจะถูกสร้างขึ้น จากนั้นเรารวมสามเธรดนี้เพื่อดำเนินการพร้อมกันโดยเรียก “thread_name. เข้าร่วม ()” วิธี แล้วเราคืนค่าเท่ากับศูนย์ คำอธิบายตัวอย่างที่กล่าวถึงก่อนหน้านี้ถูกนำไปใช้ในรูปแบบของรหัสที่สามารถแสดงในรูปต่อไปนี้:

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

บทสรุป

คู่มือนี้ให้คำอธิบายโดยละเอียดเกี่ยวกับแนวคิดของฟังก์ชัน mutex ที่ใช้ใน C++ เราได้พูดคุยกันว่าแอพพลิเคชั่นมัลติเธรดคืออะไร ปัญหาใดบ้างที่เราพบเจอในแอพพลิเคชั่นมัลติเธรด และเหตุใดเราจึงต้องใช้ mutex สำหรับแอพพลิเคชั่นมัลติเธรด จากนั้นเราได้พูดถึงไวยากรณ์สำหรับ mutex ด้วยตัวอย่างจำลองโดยใช้โค้ดหลอก จากนั้น เราได้นำตัวอย่างที่สมบูรณ์มาใช้ในแอปพลิเคชันแบบมัลติเธรดด้วย mutex บน visual studio C++