ฉันมีโปรเซสเซอร์ Pentium core i5 ซึ่งมี 4 คอร์ ถ้าฉันทำเช่นนี้ในโปรแกรมคอนโซล C #
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
มีการรับประกันว่าเธรด t1 และ t2 จะทำงานบนแกนที่แยกกันหรือไม่
ฉันมีโปรเซสเซอร์ Pentium core i5 ซึ่งมี 4 คอร์ ถ้าฉันทำเช่นนี้ในโปรแกรมคอนโซล C #
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
มีการรับประกันว่าเธรด t1 และ t2 จะทำงานบนแกนที่แยกกันหรือไม่
คำตอบ:
คุณไม่สามารถรับประกันใน. Net ที่ทั้งสองThreadทำงานบนสองคอร์แยกกัน ในความเป็นจริงคุณยังไม่สามารถรับประกันได้ว่าหนึ่งThreadจะทำงานเพียงหนึ่งหลัก (!)
นี่เป็นเพราะเธรดที่ได้รับการจัดการไม่เหมือนกับเธรด OS - เธรดที่มีการจัดการเดียวอาจใช้หลายเธรด OS เพื่อสนับสนุน ใน C # คุณเท่านั้นที่เคยจัดการโดยตรงกับการจัดการThreads (อย่างน้อยโดยไม่ต้อง resorting P / วิงวอนขอเรียกฟังก์ชั่น WinAPI เกลียวซึ่งคุณไม่ควรทำ)
อย่างไรก็ตามตัวจัดกำหนดการเธรด. Net และ Windows ทำได้ดีมากในสิ่งที่พวกเขาทำพวกเขาจะไม่รันสองเธรดบนแกนเดียวในขณะที่แกนที่สองตั้งอยู่ว่าง โดยทั่วไปแล้วคุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้
Threads เป็นเธรด OS แต่นั่นไม่ใช่เหตุผลที่ไม่มีการรับประกันว่าเธรดเดี่ยวจะทำงานบนแกนเดียวกันเสมอ
asyncคำหลัก(ซึ่งเป็นสิ่งที่ผมถือว่าคุณกำลังพูดถึงเป็น "หัวข้อ async" ซ้ำซ้อน)เป็นเพียงการสร้างประโยคน้ำตาลสำหรับการใช้BackgroundWorkerด้ายซึ่งเป็นเหมือนด้ายสุทธิอื่น ๆ - คุณไม่สามารถรับประกันว่ามันจะทำงานบน แยกแกนหรือไม่
ไม่ระบบปฏิบัติการและซีพียูจะตัดสินใจว่าจะเรียกใช้เมื่อใด ในตัวอย่างง่ายๆที่คุณแสดงให้เห็นถึงการยกเว้นงานอื่น ๆ ใช่ว่างานเหล่านั้นมักจะทำงานแบบขนานบนแกนที่แยกจากกัน แต่ไม่ค่อยมีการรับประกันว่าจะเป็นเช่นนั้น
คุณสามารถใช้ความสัมพันธ์ของเธรดเพื่อพยายามควบคุมการจัดสรรคอร์ให้กับเธรดที่กำหนด
พิจารณาการจัดตารางเวลาลำดับความสำคัญเพื่อจัดเรียงเด็คในแง่ของเธรดที่ควรขนานกันทั้งหมดและสามารถรอได้
t1และt2ดำเนินการในเวลาที่ต่างกันตามลำดับโดยพลการ (เช่นเป็นไปได้ที่จะt2เริ่มก่อนt1ในบางรุ่น)