มัลติเธรด เป็นแนวคิดของการรันหลายเธรดของการดำเนินการภายในโปรแกรมเดียว เป็นคุณลักษณะที่มีประโยชน์มากในภาษาการเขียนโปรแกรม เช่น C++ เนื่องจากช่วยให้เราดำเนินการหลายอย่างพร้อมกันได้ ใน C ++ มัลติเธรด ได้ทาง <เธรด> ไลบรารี ซึ่งมีชุดของคลาสและฟังก์ชันที่ช่วยให้นักพัฒนาสามารถสร้าง จัดการ และควบคุมหลายเธรดได้
มัลติเธรด ก็เหมือนกับการทำงานหลายอย่างพร้อมกัน หมายความว่าเธรดสองเธรดขึ้นไปทำงานพร้อมกัน ในโปรแกรมดังกล่าว แต่ละคอมโพเนนต์จะเรียกว่าเธรด และแต่ละเธรดจะระบุพาธของการดำเนินการที่ไม่ซ้ำกัน ไม่มีการสนับสนุนในตัวสำหรับ มัลติเธรด โปรแกรมก่อนหน้า C ++ 11 คุณลักษณะนี้มีให้โดยระบบปฏิบัติการแทน
มัลติเธรด ยังสามารถเรียกว่าการแบ่งโปรแกรมออกเป็นเธรดย่อยๆ ที่รันพร้อมกัน คลาสเธรดซึ่งใช้สำหรับ มัลติเธรด ใน C++ ช่วยให้คุณสร้างเธรดจำนวนมากและจัดการการดำเนินการได้
สร้างเธรดใน C ++
ในการสร้างเธรดใน C++ เราใช้ มาตรฐาน :: เธรด คลาสซึ่งรวมอยู่ในไลบรารีเธรดในตัว ก โทรได้ ถูกกำหนดเป็นอาร์กิวเมนต์ให้กับตัวสร้างของออบเจกต์ของคลาส มาตรฐาน :: เธรด เพื่อสร้างเธรดใหม่ รหัสที่เรียกใช้งานเมื่อเธรดทำงานอยู่เรียกว่า โทรได้ . เมื่อเราสร้าง a มาตรฐาน :: เธรด วัตถุเธรดใหม่ถูกสร้างขึ้นซึ่งทำให้เกิดรหัสที่จัดทำโดย โทรได้ ที่จะเรียกใช้ โทรได้ สามารถกำหนดได้โดยใช้สามวิธีนี้
วิธีที่ 1: ตัวชี้ฟังก์ชัน
โทรได้ ฟังก์ชันโดยใช้ตัวชี้ฟังก์ชันสามารถกำหนดได้ดังนี้
ถือเป็นโมฆะ function_call ( พารามิเตอร์ )
เมื่อสร้างฟังก์ชันแล้ว วัตถุเธรดที่มีฟังก์ชันจะถูกสร้างขึ้นดังนี้:
std::thread thread_obj ( function_call พารามิเตอร์ ) ;
วิธีที่ 2: วัตถุฟังก์ชัน
ในขณะที่ใช้อ็อบเจกต์ฟังก์ชัน เราใช้ประโยชน์จากแนวคิดของการโอเวอร์โหลดตัวดำเนินการ รหัสที่ต้องเรียกใช้ในขณะที่กำลังสร้างเธรดมีอยู่ในฟังก์ชันโอเวอร์โหลด
คลาส Object_class {ตัวดำเนินการเป็นโมฆะ ( ) ( พารามิเตอร์ )
{
// รหัสที่จะดำเนินการ
}
} ;
std::thread thread_object ( Object_คลาส ( ) พารามิเตอร์ )
วิธีที่ 3: นิพจน์แลมบ์ดา
โทรได้ ฟังก์ชันที่ใช้นิพจน์แลมบ์ดาสามารถกำหนดได้ดังนี้
อัตโนมัติ f = [ ] ( พารามิเตอร์ ) {// รหัสที่จะดำเนินการ
} ;
std::thread thread_object ( ฉ พารามิเตอร์ ) ;
ตัวอย่างการใช้มัลติเธรดใน C++
#รวมถึง#รวม <เธรด>
ใช้เนมสเปซ std;
เป็นโมฆะ func_thread ( int N )
{
สำหรับ ( int ฉัน = 0 ; ฉัน < ยังไม่มีข้อความ; ฉัน ++ ) {
ศาล << 'เธรด 1 :: callable => การใช้ตัวชี้ฟังก์ชัน \n ' ;
}
}
คลาส thread_obj {
สาธารณะ:
ตัวดำเนินการเป็นโมฆะ ( ) ( int น ) {
สำหรับ ( int ฉัน = 0 ; ฉัน < n; ฉัน ++ )
ศาล << 'เธรด 2 :: callable => การใช้วัตถุฟังก์ชัน \n ' ;
}
} ;
int หลัก ( )
{
อัตโนมัติ f = [ ] ( int น ) {
สำหรับ ( int ฉัน = 0 ; ฉัน < n; ฉัน ++ )
ศาล << 'เธรด 3 :: callable => ใช้นิพจน์แลมบ์ดา \n ' ;
} ;
เธรดที่ 1 ( func_thread, 2 ) ;
เธรดที่ 2 ( thread_obj ( ) , 2 ) ;
กระทู้ที่ 3 ( ฉ 2 ) ;
th1.join ( ) ;
th2.join ( ) ;
th3.join ( ) ;
กลับ 0 ;
}
ในโค้ดข้างต้น เราได้พัฒนาสามเธรดโดยแยกออกเป็นสามส่วน โทรได้ — ตัวชี้ฟังก์ชัน วัตถุ และนิพจน์แลมบ์ดา แต่ละเธรดเริ่มต้นเป็นสองอินสแตนซ์แยกกัน เธรดสามเธรดทำงานพร้อมกันและแยกกันตามที่ระบุในเอาต์พุต
เอาต์พุต
ข้อดีและข้อเสียของมัลติเธรด
ทำงานได้มากขึ้นเร็วขึ้นด้วย มัลติเธรด . เนื่องจากช่วยให้เธรดจำนวนมากสามารถทำงานต่างๆ ได้พร้อมกัน มัลติเธรด ช่วยให้โปรแกรมเมอร์ทำกิจกรรมเครือข่าย ประมวลผลภาพถ่ายหรือวิดีโอ และดำเนินการคำนวณที่ซับซ้อนโดยไม่ทำให้แอปพลิเคชันที่เหลือทำงานช้าลง มัลติเธรด ช่วยในการสร้างส่วนติดต่อผู้ใช้ที่ตอบสนองมากขึ้น ด้วยการรันโค้ดที่เปลี่ยนหน้าจอในเธรดที่แยกจากกัน เธรด UI จะถูกเก็บไว้อย่างอิสระเพื่อทำงานอื่นๆ เช่น ตอบสนองต่อการป้อนข้อมูลของผู้ใช้ ส่งผลให้ส่วนติดต่อผู้ใช้ราบรื่นและเร็วขึ้น
อย่างไรก็ตาม มีข้อจำกัดบางประการในการใช้งาน มัลติเธรด . หนึ่งในความท้าทายที่สำคัญเมื่อทำงานร่วมกับ มัลติเธรด โปรแกรมกำลังหลีกเลี่ยงสภาพการแข่งขัน สภาวะการแย่งชิงคือสถานการณ์ที่เธรดตั้งแต่สองเธรดขึ้นไปพยายามเข้าถึงทรัพยากรที่ใช้ร่วมกันเดียวกันในเวลาเดียวกัน ซึ่งนำไปสู่พฤติกรรมที่คาดเดาไม่ได้ เพื่อหลีกเลี่ยงสภาวะการแย่งชิง นักพัฒนาใช้เทคนิคการซิงโครไนซ์ เช่น mutexes, semaphores และอุปสรรค
บทสรุป
มัลติเธรด ใน C++ เป็นแนวคิดที่มีประสิทธิภาพที่ช่วยให้นักพัฒนาสามารถสร้างโปรแกรมที่สามารถทำงานหลายอย่างพร้อมกันได้ ด้วยการใช้คลาสเธรดที่ไลบรารีจัดเตรียมไว้ นักพัฒนาสามารถสร้าง จัดการ และควบคุมหลายเธรดได้ มัลติเธรด สามารถใช้เพื่อปรับปรุงประสิทธิภาพ เพิ่มการตอบสนอง และเอาชนะข้อจำกัดของทรัพยากรระบบ อย่างไรก็ตามเนื่องจากความท้าทายที่เกี่ยวข้องในการทำงานกับ มัลติเธรด โปรแกรม นักพัฒนาจำเป็นต้องระมัดระวังและใช้เทคนิคการซิงโครไนซ์ที่เหมาะสมเพื่อหลีกเลี่ยงสภาวะการแย่งชิง