4 çekirdekli bir Pentium core i5 işlemciye sahibim. Bunu bir C # konsol programında yaparsam
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
t1 ve t2 dişlerinin ayrı çekirdeklerde çalışması garanti edilir mi?
4 çekirdekli bir Pentium core i5 işlemciye sahibim. Bunu bir C # konsol programında yaparsam
var t1 = new Thread(Thread1);
var t2 = new Thread(Thread2);
t1.Start();
t2.Start();
t1 ve t2 dişlerinin ayrı çekirdeklerde çalışması garanti edilir mi?
Yanıtlar:
Net'te, iki Thread
s iki ayrı çekirdeğin üzerinde çalışacağını garanti edemezsiniz . Aslında, birinin Thread
yalnızca bir çekirdeğin (!) Üzerinde çalışacağını da garanti edemezsiniz .
Bunun nedeni, yönetilen iş parçacıklarının işletim sistemi iş parçacıkları ile aynı olmamasıdır - tek bir yönetilen iş parçacığı bunu desteklemek için birden fazla işletim sistemi iş parçacığı kullanabilir. C #, sadece şimdiye kadar yönetilen doğrudan ilgisi Thread
s (yapmanız asla WinAPI diş arama fonksiyonlarıyla en azından p / çağırmak için başvurmadan) .
Ancak, .NET ve Windows iş parçacığı zamanlayıcılar ne yaptıklarında çok iyi - ikinci bir çekirdek tamamen boşta dururken, tek bir çekirdekte iki iş parçacığı çalıştırmazlar. Yani, genel olarak, endişelenmenize gerek yok.
Thread
ler vardır OS ipler. Ancak, tek bir dişlinin her zaman aynı çekirdeğin üzerinde çalışacağı garantisi yoktur.
async
Anahtar kelime (sana "zaman uyumsuz iş parçacığı" olarak bahsediyoruz varsayalım ne gereksiz) bir kullanma sadece sözdizimsel şeker BackgroundWorker
başka Net iplik gibi olan iplik, - Eğer garanti bir çalışacağını olamaz mı ayrı bir çekirdek olsun ya da olmasın.
Hayır, işletim sistemi ve CPU neyin ne zaman çalıştırılacağına karar verecek. göstermiş olduğunuz basit örnekte, diğer görevlerin hariç tutulması durumunda, evet, büyük olasılıkla ayrı çekirdeğe paralel olarak çalışacaklardı, ancak nadiren bunun olacağı garantisi var.
Bir çekirdeğin verilen bir dişe tahsisi üzerinde kontrol sahibi olmak için iplik benzeşimini kullanabilirsiniz .
Ayrıca , hangi yivlerin tamamen paralel olması ve hangilerinin bekleyebileceği konusunda istifleme için programlama önceliklerini göz önünde bulundurun .
t1
vet2
keyfi bir sırada farklı zamanlarda yürütülürseniz , kod gerçekten güvenlidir (örneğin , bazı modellerde daha öncet2
başlar ).t1