У мене є процесор 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 на окремих ядрах?
Відповіді:
Ви не можете гарантувати в. Немає того, що два Thread
s працюють на двох окремих ядрах. Насправді ви також не можете гарантувати, що один Thread
запуск буде працювати лише на одному ядрі (!) .
Це відбувається тому, що керовані потоки не збігаються з потоками ОС - одна керована Нитка може використовувати декілька потоків ОС для її підтримки. У C # ви завжди працюєте безпосередньо з керованими Thread
s (принаймні, не вдаючись до p / invoke для виклику функцій нарізки WinAPI, чого ви ніколи не повинні робити) .
Однак планувальники потоків .Net та Windows дуже хороші в тому, що вони роблять - вони не запускатимуть два потоки на одному ядрі, тоді як другий ядро сидить повністю в режимі очікування. Тож загалом про це не потрібно хвилюватися.
Thread
s - це потоки ОС. Але це не є причиною того, що немає жодної гарантії того, що один потік завжди буде виконуватися на одному ядрі.
async
Ключове слово (що я припускаю , що ви говорите, як «асинхронними потоками» є зайвим) просто синтаксичний цукор для використання BackgroundWorker
нитки, яка , як і будь-який інший .Net темі - ви можете не гарантія того , що буде працювати на окреме ядро чи ні.
Ні, ОС і процесор вирішать, що потрібно запускати і коли. у простому прикладі, який ви показали, виключаючи інші завдання, так, швидше за все, вони працюватимуть паралельно на окремих ядрах, але рідко є гарантія, що так буде.
Ви можете використовувати спорідненість з потоком, щоб спробувати взяти деякий контроль над розподілом ядра для даного потоку.
Також розгляньте пріоритети планування для складання колоди, з точки зору того, що потоки повинні бути повністю паралельними, а які можуть чекати.
t1
іt2
виконуються в різний час в довільному порядку (наприклад , це можливоt2
починається доt1
того, в деяких моделях).