ฉันมีโปรเซสเซอร์ 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 # คุณเท่านั้นที่เคยจัดการโดยตรงกับการจัดการThread
s (อย่างน้อยโดยไม่ต้อง resorting P / วิงวอนขอเรียกฟังก์ชั่น WinAPI เกลียวซึ่งคุณไม่ควรทำ)
อย่างไรก็ตามตัวจัดกำหนดการเธรด. Net และ Windows ทำได้ดีมากในสิ่งที่พวกเขาทำพวกเขาจะไม่รันสองเธรดบนแกนเดียวในขณะที่แกนที่สองตั้งอยู่ว่าง โดยทั่วไปแล้วคุณไม่จำเป็นต้องกังวลเกี่ยวกับเรื่องนี้
Thread
s เป็นเธรด OS แต่นั่นไม่ใช่เหตุผลที่ไม่มีการรับประกันว่าเธรดเดี่ยวจะทำงานบนแกนเดียวกันเสมอ
async
คำหลัก(ซึ่งเป็นสิ่งที่ผมถือว่าคุณกำลังพูดถึงเป็น "หัวข้อ async" ซ้ำซ้อน)เป็นเพียงการสร้างประโยคน้ำตาลสำหรับการใช้BackgroundWorker
ด้ายซึ่งเป็นเหมือนด้ายสุทธิอื่น ๆ - คุณไม่สามารถรับประกันว่ามันจะทำงานบน แยกแกนหรือไม่
ไม่ระบบปฏิบัติการและซีพียูจะตัดสินใจว่าจะเรียกใช้เมื่อใด ในตัวอย่างง่ายๆที่คุณแสดงให้เห็นถึงการยกเว้นงานอื่น ๆ ใช่ว่างานเหล่านั้นมักจะทำงานแบบขนานบนแกนที่แยกจากกัน แต่ไม่ค่อยมีการรับประกันว่าจะเป็นเช่นนั้น
คุณสามารถใช้ความสัมพันธ์ของเธรดเพื่อพยายามควบคุมการจัดสรรคอร์ให้กับเธรดที่กำหนด
พิจารณาการจัดตารางเวลาลำดับความสำคัญเพื่อจัดเรียงเด็คในแง่ของเธรดที่ควรขนานกันทั้งหมดและสามารถรอได้
t1
และt2
ดำเนินการในเวลาที่ต่างกันตามลำดับโดยพลการ (เช่นเป็นไปได้ที่จะt2
เริ่มก่อนt1
ในบางรุ่น)