วิธีใช้มัลติเธรดใน C++

Withi Chi Malti Therd Ni C



มัลติเธรด เป็นแนวคิดของการรันหลายเธรดของการดำเนินการภายในโปรแกรมเดียว เป็นคุณลักษณะที่มีประโยชน์มากในภาษาการเขียนโปรแกรม เช่น 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++ เป็นแนวคิดที่มีประสิทธิภาพที่ช่วยให้นักพัฒนาสามารถสร้างโปรแกรมที่สามารถทำงานหลายอย่างพร้อมกันได้ ด้วยการใช้คลาสเธรดที่ไลบรารีจัดเตรียมไว้ นักพัฒนาสามารถสร้าง จัดการ และควบคุมหลายเธรดได้ มัลติเธรด สามารถใช้เพื่อปรับปรุงประสิทธิภาพ เพิ่มการตอบสนอง และเอาชนะข้อจำกัดของทรัพยากรระบบ อย่างไรก็ตามเนื่องจากความท้าทายที่เกี่ยวข้องในการทำงานกับ มัลติเธรด โปรแกรม นักพัฒนาจำเป็นต้องระมัดระวังและใช้เทคนิคการซิงโครไนซ์ที่เหมาะสมเพื่อหลีกเลี่ยงสภาวะการแย่งชิง