C ++ 11 std :: posix konuları vs konuları


157

Pratikte neden birini veya diğerini tercih etmeliyim? std::threadSınıf dışında teknik farklılıklar nelerdir ?


5
Pratikte kullanmalısınızstd::async
Stephan Dollberg

aynı problemlere Bu acılarını @bamboon std::threadyapar
Gunther Piez

2
@hirschhornsalz derleyici desteği görünümünden, evet. teknik açıdan istisna güvenlik sunar, ki bu std::threadda pthreadsyoktur.
Stephan Dollberg

15
Oy verildi reopen. "Teknik farklılıklar" talebi bunu objektif olarak cevaplanabilir kılmaktadır. Yüksek oy sayısı, başkalarının bu yazıyı yapıcı ve yararlı bulduğunu gösterir.
Adrian McCarthy

Yanıtlar:


122

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.


19
Bu "performans darboğazı" iddialarını destekleyecek kanıtlarınız var mı? Ayrıca, std::threadraii stili iyidir, çünkü pthreads kutudan çıkamazken C ++ istisnalarını işleyebilir.
Jesse Good

9
Şimdi 2014'te bu cevap hala geçerli mi?
14'te

25
Peki ya 2017'nin başında?
rmobis

9
Peki ya 2017 Middle'da?
Yörüngedeki Hafiflik Yarışları

14
Peki ya şimdi, 2018 Ortasında?
力 力

60

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.


5
+1en önemli şeyi işaret ettiğim için benden :: std :: thread daha yüksek bir soyutlama seviyesi sunuyor.
sbi

33

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.


2
aslında, std :: iş parçacıkları C ++ 11'i destekleyen tüm platformlarda taşınabilirlik sağlarken, POSIX iş parçacıkları yalnızca POSIX platformlarında (veya bazı minimum uyumluluk için çalışan platformlarda) kullanılabilir.
Tobias Langner

1
Pratik POV'dan bu sadece yanlış. Aslında birkaç ay önce bu muhakemeye karar verdim - bu büyük bir hataydı. Uygulamada 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 .
Gunther Piez

1
@hirschhornsalz, cevabımın amacı, pthread'e kıyasla c ++ 11 iplik uygulaması tarafından sağlanan taşınabilirliğin faydasına işaret etmektir. OP artırmak hakkında sormadı, ama onun da taşınabilir.
Brady

3
@ hirschhornsalz, negatif tonunuz ve hiç iplik kullanmama suçlamanıza gelince, sadece basit bir şekilde yapıcı değiller ve benim açımdan fazla çaba göstermeyi hak etmiyorlar. Ben daha yapıcı bir yorum farklı platformlarda std :: thread kullanmaya çalıştığınız sorunları işaret etmek olurdu söz ederken en azından değer düşünüyorum.
Brady

3
Özetlemek gerekirse, c ++ 11 std :: thread sadece GCC'nin son sürümlerinde kullanılabilir. Visual Studio'da neredeyse tamamlanmamıştır, bu nedenle Windows'ta kullanılamaz. Ve elbette UNIX'lerde ticari derleyicilerde eksik (Solaris üzerinde Sun Studio, HP-UX üzerinde HP aCC, AIX üzerinde IBM vacpp) kesinlikle eksik. Bu nedenle, hedef platformunuz yalnızca Linux ise - c ++ 11 std :: thread gayet iyi; ayrıca Windows veya diğer UNIX - boost :: thread gerekiyorsa gitmek için yoldur.
9'da vond

7

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.


7
Katılmıyorum. Ve sinyallerin yoğun kullanımı, çoğu uygulama için önlenebilecek bir tasarım modelidir.
Erik Alapää

Ayrıca, std::threadpthread'in sahip olmadığı tip güvenliği getirir.
alfC

-3

OpenMP

http://www.openmp.org/

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.


6
Saygısızlık yok, ama bu ana soru ile nasıl ilişkili?
SRG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.