Zaman uyumsuz (:: başlatmak zaman uyumsuz) pahalı bir iş parçacığı havuzu iş parçacığı oluşturma kaçınmak için eski C 11? | Netgez.com
SORU
16 Ocak 2013, ÇARŞAMBA


Zaman uyumsuz (:: başlatmak zaman uyumsuz) pahalı bir iş parçacığı havuzu iş parçacığı oluşturma kaçınmak için eski C 11?

Gevşek bu soru ile ilgilidir: Are std::thread pooled in C 11?. Soru farklı olsa da, amaç aynı:

Soru 1: hala anlam (ya da 3. parti kitaplığı) kendi iş parçacığı havuzları pahalı bir iş parçacığı oluşturma önlemek için kullanmak mümkün olur Mu?

Diğer soruda sonuç std::thread (olabilir veya olmayabilir) havuza için bağımlı olamaz. Ancak, std::async(launch::async) çok daha yüksek bir havuza olma şansı var gibi görünüyor.

Standart tarafından zorunlu olduğunu değil, ama tüm iyi C 11 uygulamaları bu beklenirdi IMHO iş parçacığı iş parçacığı oluşturma yavaşsa havuzu kullanmak istiyorsunuz. Sadece yeni bir iş parçacığı oluşturmak için ucuz olduğu platformlarda, her zaman yeni bir iş parçacığı spawn bu beklenirdi.

Soru 2: Bu, tam da düşündüğüm gibi, ama bunu kanıtlayacak hiçbir gerçekler var. Çok iyi yanlış olabilir. Eğitimli bir tahmin mi?

Son olarak, burada ilk iş parçacığı oluşturma async(launch::async) ile ifade edilebilir sanırım nasıl gösteren örnek bir kod hazırladım:

Örnek 1:

 thread t([]{ f(); });
 // ...
 t.join();

olur

 auto future = async(launch::async, []{ f(); });
 // ...
 future.wait();

Örnek 2: iplik Ateşi unutun

 thread([]{ f(); }).detach();

olur

 // a bit clumsy...
 auto dummy = async(launch::async, []{ f(); });

 // ... but I hope soon it can be simplified to
 async(launch::async, []{ f(); });

Questin 3: thread sürümleri için async sürümleri tercih edersiniz?


Gerisi artık açıklığa kavuşması için soru, ama sadece bir parçasıdır

Neden dönüş değeri boş bir değişkene atanması gerekir?

Ne yazık ki, geçerli C 11 standart değer, eylem sona kadar olan bloklar çalıştırılır dönüş yakalayan zorlar. Bazı standart bir hata olarak kabul edilir (Herb Sutter örneğin,).

cppreference.com Bu örnek de güzel gösterir:

{
  std::async(std::launch::async, []{ f(); });
  std::async(std::launch::async, []{ g(); });  // does not run until f() completes
}

Başka bir açıklama:

Biliyorumiş parçacığı havuzu diğer legimate kullanır olabilir ama bu soru sadece pahalı bir iş parçacığı oluşturma masraflarının yönü ilginç duyuyorum.

Hala iş parçacığı havuzu özellikle kaynakları üzerinde daha fazla kontrol gerekiyorsa çok yararlı olduğu durumlar vardır bence. Örneğin, bir sunucu istekleri sadece belirli sayıda hızlı yanıt süreleri garanti simulatenously işlemek ve bellek kullanımı tahmin edilebilirliğini artırmaya karar verebilir. İş parçacığı havuzu güzel, burada olmalı.

İş parçacığı yerel değişkenleri de kendi iş parçacığı havuzu için bir argüman olabilir, ama pratikte revelant olup olmadığından emin değilim:

  • std::thread ile yeni bir iÅŸ parçacığı oluÅŸturma iÅŸ parçacığı yerel deÄŸiÅŸkenleri baÅŸlatıldı olmadan baÅŸlar. Belki de istediÄŸin bu deÄŸil.
  • Konuları async tarafından oluÅŸturulan iÅŸ parçacığı yeniden olabilirdi çünkü benim için biraz belirsiz. Anladığım kadarıyla, iÅŸ parçacığı yerel deÄŸiÅŸkenleri resetted olmasını garanti edilmez, ama yanılıyor olabilirim.
  • (Sabit boyutlu) kendi iÅŸ parçacığı havuzları kullanarak, diÄŸer yandan, eÄŸer gerçekten ihtiyacınız varsa, size tam kontrol saÄŸlar.

CEVAP
16 Ocak 2013, ÇARŞAMBA


Soru 1:

Linux iş parçacığı oluşturma çok daha yapıldığını biliyorum. Ve bu yüzden Linux iş parçacığı oluşturma maliyetleri önlemek için iş parçacığı havuzu için fazla bir sebep yok.

Ben de standart kütüphane iş parçacığı oluşturma oldukça şeffaf yapmak gerçekten çok bu hesaplama etkilediğini sanmıyorum. Sadece yapar '' bir iş parçacığı başlatmak için daha hızlı ve daha kolay gibi. C OS üzerinde daha fazla bağlıdır . IMHO, İşletim sistemleri mümkün olduğunca ucuz iş parçacığı oluşturma yapmak gerekir bir sürü nedeni var. Döngüler otomatik paralellik sadece bir örnek.

Soru 2:

Evet, temelde bu 'örtülü' bir konu. başlattı Ama gerçekten, neler oluyor hala oldukça açık. Gerçekten kelime örtülü olarak özellikle iyi bir kelime olduğunu sanmıyorum.

Soru 3:

Kişisel olarak, iş parçacığı başlatır açık olmayı severim. Seri erişim garanti nerede adalarda değer bir sürü yer. Aksi takdirde her zaman bir dışlama bir yerde etrafına sararak ve bunu kullanmak için hatırlamak o kadar değişken devlet ile sonuçlanıyor.

Çalışma sırası modeli çok daha iyi 'gelecek' seri Adaları 'daha etkili bir değişken devlet işleyebilir ortalıkta. çünkü modeli daha çok sevmiştim

Ama gerçekten, tam olarak ne yaptığınızı bağlıdır.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ★ByScrapi★ Designs

    ★ByScrapiâ

    27 AÄžUSTOS 2013
  • curioustravelers

    curioustrave

    12 AÄžUSTOS 2006
  • khloe brooks

    khloe brooks

    25 Temmuz 2011