C# içerisindeki etkileri gözlemlemek için iş parçacığı açlığını indüklemeye/neden etmeye çalışıyorum.C# iş parçacığı açılımı nasıl taklit edilir
Hiç kimse, diş açlığını tetikleyecek şekilde oluşturulabilecek bir (basit) uygulama önerebilir mi?
C# içerisindeki etkileri gözlemlemek için iş parçacığı açlığını indüklemeye/neden etmeye çalışıyorum.C# iş parçacığı açılımı nasıl taklit edilir
Hiç kimse, diş açlığını tetikleyecek şekilde oluşturulabilecek bir (basit) uygulama önerebilir mi?
Seti iplik öncelik ve iplik yakınlık
İşçi sınıfı
class PriorityTest
{
volatile bool loopSwitch;
public PriorityTest()
{
loopSwitch = true;
}
public bool LoopSwitch
{
set { loopSwitch = value; }
}
public void ThreadMethod()
{
long threadCount = 0;
while (loopSwitch)
{
threadCount++;
}
Console.WriteLine("{0} with {1,11} priority " +
"has a count = {2,13}", Thread.CurrentThread.Name,
Thread.CurrentThread.Priority.ToString(),
threadCount.ToString("N0"));
}
}
Ve Test
class Program
{
static void Main(string[] args)
{
PriorityTest priorityTest = new PriorityTest();
ThreadStart startDelegate =
new ThreadStart(priorityTest.ThreadMethod);
Thread threadOne = new Thread(startDelegate);
threadOne.Name = "ThreadOne";
Thread threadTwo = new Thread(startDelegate);
threadTwo.Name = "ThreadTwo";
threadTwo.Priority = ThreadPriority.Highest;
threadOne.Priority = ThreadPriority.Lowest;
threadOne.Start();
threadTwo.Start();
// Allow counting for 10 seconds.
Thread.Sleep(10000);
priorityTest.LoopSwitch = false;
Console.Read();
}
}
Kod çoğunlukla thread affinity ayarlamak için ihtiyacınız olabilecek çok çekirdekli sistemine sahip ayrıca eğer msdn alınan. Gerçek açlık görmek için daha fazla iş parçacığı oluşturmanız gerekebilir.
Uygulamanızın iş parçacığı sırasını görev yöneticisinde ayarlayın, böylece yalnızca bir çekirdek üzerinde çalışır. Ardından, uygulamanızda yüksek öncelikli meşgul bir iş parçacığı başlatın.
Sadece saf kodlama ile bunu yapmanın başka bir yolu var mı? (yani görev yöneticisi bölümü olmadan) –
@Sean Bkz. işlem özellikleri http://msdn.microsoft.com/en-us/library/76yt3c0w.aspx –
İyi örnek. Optimizasyon sorunlarını önlemek için loopSwitch'i geçici olarak bildirmek isteyebilirsiniz. – Tudor
Yardımın için teşekkürler! –
Kodunuza herhangi bir yakın ilgi eklemediniz. Çok çekirdekli bir sistemde, bu örnek her iki iş parçacığının başlangıcında satır eklemediğiniz sürece 10 saniyeliğine (amaçlanmayan) çalıştığını gösterir: 'Process.GetCurrentProcess(). ProcessorAffinity = (System.IntPtr) 1;' (iş parçacığının yalnızca ilk işlemcide programlanabileceğini belirtir). – Virtlink