Pratikte neden birini veya diğerini tercih etmeliyim? std::thread
Sınıf dışında teknik farklılıklar nelerdir ?
std::thread
yapar
std::thread
da pthreads
yoktur.
Pratikte neden birini veya diğerini tercih etmeliyim? std::thread
Sınıf dışında teknik farklılıklar nelerdir ?
std::thread
yapar
std::thread
da pthreads
yoktur.
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::thread
gayet 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::thread
sı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::thread
veya 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_mutex
hala uygulanmamıştır.
std::thread
raii stili iyidir, çünkü pthreads kutudan çıkamazken C ++ istisnalarını işleyebilir.
std::thread
Kitaplığı (örneğin: libstdc ++) bir ortam destekleyici Pthreads içinde Pthreads üstüne uygulanmaktadır.
Bence ikisi arasındaki büyük fark soyutlama. std::thread
bir C ++ sınıf kütüphanesidir. std::thread
Scoped kilitler, özyinelemeli muteksleri, gelecek / vaadi tasarım deseni uygulamaları ve daha fazlasını kütüphane örneğin birçok soyut özellikleri içerir.
+1
en ö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::thread
henüz tüm platformlarda tam olmayabilir. Yine de, (yakın gelecekte olacak) pthread
tercihlerinize tercih edilmelidir, çünkü başvurunuzu daha geleceğe dönük hale getirmelidir.
boost::thread
Win64 veya Bionic (Android) üzerinde kullanmanız gerekiyor , çünkü std::thread
hala Linux'ta std::thread
oldukç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::thread
pthread'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