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 Threads iki ayrı çekirdeğin üzerinde çalışacağını garanti edemezsiniz . Aslında, birinin Threadyalnı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 Threads (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.
Threadler vardır OS ipler. Ancak, tek bir dişlinin her zaman aynı çekirdeğin üzerinde çalışacağı garantisi yoktur.
asyncAnahtar kelime (sana "zaman uyumsuz iş parçacığı" olarak bahsediyoruz varsayalım ne gereksiz) bir kullanma sadece sözdizimsel şeker BackgroundWorkerbaş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 .
t1vet2keyfi bir sırada farklı zamanlarda yürütülürseniz , kod gerçekten güvenlidir (örneğin , bazı modellerde daha öncet2başlar ).t1