SORU
16 Mayıs 2013, PERŞEMBE


İplik.(1) özel uyku?

Joe Duffy (Concurrent Programming on Windows yazarı) this blog article Bu konuya yazar.Uyku(1) İplik tercih edilir.Aynı ve daha düşük öncelikli iş parçacığı, sadece İplik olarak eşit öncelikli iş parçacıklarının askıya alacak çünkü uyku(0).Uyku(0).

.NET version of MSDN says iş Parçacığı.Uyku(0) özeldir, bu iş parçacığı askıya ve diğer bekleyen iş parçacığı çalıştırmak için izin verecektir. Ama konu hakkında hiçbir şey söylemez.(1) (Herhangi bir .uyku NET sürüm).

İş Parçacığı.(1) aslında bir şey yaptığı özel uyku?

Arka plan:

Ferahlatıcı ediyorum eşzamanlı programlama bilgimle. Bazı yazdığım C# kodunu gözle görülür bir şekilde artırır ve azaltır non-atomik sonrası/öncesi ve bu nedenle iş parçacığı için güvenli olmadığını göstermek için.

Bir konu yer parçacığı yüzlerce oluşturmak gerek önlemek için.Zamanlayıcı başka bir iş parçacığı çalıştırmak için zorlamak için paylaşılan bir değişken artırma sonra uyku(0). Konuları düzenli olarak değiştirmeyi bu önceden olmayan atomik yapısı ile post arttırma//indirim daha belirgin hale getirir.

İplik.Uyku(0) beklendiği gibi ek bir gecikme olur, gibi görünüyor. Ancak eğer konuya bu da değişir.Uyku(1), normal uyku geri dönmek için görünür davranış (örn. Yaklaşık 1ms gecikme en az) alıyorum.

Bu konu ise anlamına gelir.Uyku(1) tercih edilebilir, bir döngü içinde kullanan herhangi bir kod çok daha yavaş çalışır.

Bu "Could someone explain this interesting behaviour with Sleep(1)?" bir nevi alakalı ama C odaklanmış ve sadece Joe Duffy'nin blog makaledeki kılavuz tekrarlar ÇOK soru.

İşte ilgilenenler için benim kod (bir sınıf eklemek için yapmanız gerekebilir LinqPad, kopyalanan):

int x = 0;

void Main()
{
    List<Thread> threadList=new List<Thread>();
    Stopwatch sw=new Stopwatch();

    for(int i=0; i<20; i  )
    {
        threadList.Add(new Thread(Go)); 
        threadList[i].Priority=ThreadPriority.Lowest;
    }

    sw.Start();

    foreach (Thread thread in threadList)
    {
        thread.Start();
    } 


    foreach (Thread thread in threadList)
    {
        thread.Join();
    } 

    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);

    Thread.Sleep(200);
    Console.WriteLine(x);
}

void Go()
{
    for(int i=0;i<10000;i  )
    {
        x  ;
        Thread.Sleep(0);
    }
}

CEVAP
16 Mayıs 2013, PERŞEMBE


Artık Microsoft Windows API uygulaması Sleep() değiştiği için Sleep(1) yerine Sleep(0) kullanmak gerekir.

the MSDN documentation for Sleep(), şu an Uyku(0) ile olur:

Sıfır değeri, bu konuya zaman dilimi kalan vazgeçmeye neden olurbaşka bir iş parçacığıbunu çalıştırmak için hazır. Eğer başka bir iş parçacığı çalıştırmak için hazır olup olmadığını yok, fonksiyon hemen geri döner ve iş parçacığı yürütme devam eder.

Bu, Windows XP ne için kullanılır:

Sıfır değeri, bu konuya zaman dilimi kalan vazgeçmeye neden olureşit öncelikli başka bir konubunu çalıştırmak için hazır. Eğer eşit öncelik çalıştırmak için hazır diğer konuları ise yok, fonksiyon hemen geri döner ve iş parçacığı yürütme devam eder. Bu davranış, Windows Server 2003 ile başlayarak değişti.

Arasındaki fark not "başka bir iş parçacığı" ve "eşit öncelikli başka bir iş parçacığı".

Tek sebebi bu Joe Duffy gösteriyor kullanarak Uyku(1) yerine Uyku(0) olduğu için kısa Uyku() değeri önleyecek Uyku() döndükten hemen varsa, başka bir iş parçacığıeşit öncelikliWindows XP üzerinde çalışırken çalıştırmak için hazır.

Windows Uyku davranış değişikliği nedeniyle 2003 Server işletim sistemi sürümleri için bu konuda endişelenmenize gerek yok().

Joe'nun blog bu kısmına dikkatinizi çekmek isteriz:

Ve orada açıkça bir Uyku var olsa bile, onu veren üretici daha düşük bir öncelik değil, çünkü planlanan izin vermez.

XP, daha düşük öncelikli iş parçacığı ana iş parçacığı (yüksek öncelik) Uyku(0) yapsa bile açlıktan ölmüş olurdu. Post-XP, bu artık Uyku(0) daha düşük öncelikli iş parçacığı çalıştırmak için izin verir, çünkü olacak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hot For Nutrition

    Hot For Nutr

    26 ŞUBAT 2007
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • TecNoob

    TecNoob

    15 AĞUSTOS 2013