Pratikte neden birini veya diğerini tercih etmeliyim? std::threadSınıf dışında teknik farklılıklar nelerdir ?
std::threadyapar
std::threadda pthreadsyoktur.
Pratikte neden birini veya diğerini tercih etmeliyim? std::threadSınıf dışında teknik farklılıklar nelerdir ?
std::threadyapar
std::threadda pthreadsyoktur.
Yanıtlar:
Birçok platformda kod çalıştırmak istiyorsanız, Posix Konuları'na gidin. Hemen hemen her yerde bulunurlar ve oldukça olgunlar. Öte yandan sadece Linux / gcc kullanıyorsanız std::threadgayet iyi - daha yüksek bir soyutlama seviyesine, gerçekten iyi bir arayüze sahip ve diğer C ++ 11 sınıflarıyla güzel oynuyor.
C ++ 11 std::threadsınıfı maalesef C ++ 11 mevcut görünse bile her platformda güvenilir bir şekilde (henüz) çalışmaz. Örneğin, yerel Android std::threadveya Win64'te işe yaramaz veya ciddi performans darboğazları vardır (2012 itibariyle).
İyi bir değiştirme boost::thread- çok benzer std::thread(aslında aynı yazardan) ve güvenilir bir şekilde çalışıyor, ancak elbette, bir üçüncü taraf kütüphanesinden başka bir bağımlılık getiriyor.
Düzenleme: 2017 itibarıyla std::threadçoğunlukla yerli Android'de çalışıyor. Bazı sınıflar std::timed_mutexhala uygulanmamıştır.
std::threadraii stili iyidir, çünkü pthreads kutudan çıkamazken C ++ istisnalarını işleyebilir.
std::threadKitaplığı (örneğin: libstdc ++) bir ortam destekleyici Pthreads içinde Pthreads üstüne uygulanmaktadır.
Bence ikisi arasındaki büyük fark soyutlama. std::threadbir C ++ sınıf kütüphanesidir. std::threadScoped kilitler, özyinelemeli muteksleri, gelecek / vaadi tasarım deseni uygulamaları ve daha fazlasını kütüphane örneğin birçok soyut özellikleri içerir.
+1en önemli şeyi işaret ettiğim için benden :: std :: thread daha yüksek bir soyutlama seviyesi sunuyor.
std::thread Windows, MacOS ve Linux gibi farklı platformlarda taşınabilirlik sağlar.
Aşağıdaki yorumlarda @hirshhornsalz tarafından belirtildiği gibi ve ilgili cevap https://stackoverflow.com/a/13135425/1158895 , std::threadhenüz tüm platformlarda tam olmayabilir. Yine de, (yakın gelecekte olacak) pthreadtercihlerinize tercih edilmelidir, çünkü başvurunuzu daha geleceğe dönük hale getirmelidir.
boost::threadWin64 veya Bionic (Android) üzerinde kullanmanız gerekiyor , çünkü std::threadhala Linux'ta std::threadoldukça olgun görünen büyük parçalar eksik .
Benim için teknik farklılık, pthreads yerine std'de sinyal işleme ilkellerinin olmamasıdır. Tek başına std kullanarak bir Unix işleminde sinyal işlemeyi düzgün bir şekilde dikte edememe, AFAIK, std :: thread kullanımında zayıflatıcı bir kusurdur; iplik ve geri kalanı onları engelle. Std :: thread'ın pthreads kullanılarak uygulandığını ve pthread_sigmask kullanırken en iyisini umduğunuzu varsayalım. İşletme için Unix sistemleri programlamasında sinyallerin düzgün şekilde ele alınması tartışılamaz.
2016'da olduğu gibi, std :: thread bir oyuncak; bu kadar basit.
std::threadpthread'in sahip olmadığı tip güvenliği getirir.
OpenMP
on yıldan uzun süredir Linux ve Windows üzerinde çalışan, standartlaştırılmış, SMP tabanlı çok iş parçacıklı bir standarttır. OpenMP varsayılan olarak GCC ve Microsoft Visual Studio dahil tüm derleyicilerde kullanılabilir.
Dikkat edilmesi gereken bir şey, OpenMP'yi kullanırken, CPU çekirdeğinden daha fazla iş parçacığı varsa, bağlam değiştirme yükü nedeniyle performansın düşeceğidir. Akılda tutulması gereken ikinci şey, gerçek, işletim sistemi düzeyinde bir iş parçacığının başlatılmasının nispeten pahalı olmasıdır. Başlatma, bir saniyenin bir kısmıdır, ancak bazı uygulamalarda çok küçük kısımlar önemli bir masrafa sahiptir.
Eşzamanlılıkla ilgili yazılım mimarisi gereksinimleri için OpenMP kullanmak yerine "hafif iş parçacıkları" veya "yeşil iş parçacıkları" uygulamasının bazılarını aramak isteyebilirsiniz. Fark, OpenMP iş parçacıklarının gerçek, işletim sistemi düzeyi, iş parçacıkları olmasıdır, ancak "yeşil iş parçacıkları" yalnızca az sayıda gerçek iş parçacığı kullanılarak yürütülen "simüle edilmiş iş parçacıkları" olabilir.
std::async