C ++ 11 std :: utas vs utas posix

157

Mengapa saya harus memilih satu atau yang lain dalam praktik? Apa perbedaan teknis kecuali itu std::threadkelas?

Shamdor
sumber
5
Dalam praktiknya Anda harus menggunakanstd::async
Stephan Dollberg
@bamboon Ini menderita masalah yang sama dengan yang std::threadterjadi
Gunther Piez
2
@hirschhornsalz dari tampilan dukungan-kompiler, ya. dari sudut pandang teknis ia menawarkan keamanan pengecualian, yang std::threadatau pthreadstidak.
Stephan Dollberg
15
Memilih untuk membuka kembali. Permintaan untuk "perbedaan teknis" membuat ini dapat dijawab secara objektif. Jumlah suara yang tinggi menunjukkan bahwa orang lain menganggap posting ini konstruktif dan bermanfaat.
Adrian McCarthy
stackoverflow.com/questions/1273572/…
Ciro Santilli 郝海东 冠状 病 六四 事件 事件 法轮功

Jawaban:

122

Jika Anda ingin menjalankan kode pada banyak platform, pilih Thread Posix. Mereka tersedia hampir di mana-mana dan cukup matang. Di sisi lain, jika Anda hanya menggunakan Linux / gcc std::threadbaik-baik saja - ia memiliki tingkat abstraksi yang lebih tinggi, antarmuka yang sangat bagus dan bermain baik dengan kelas C ++ 11 lainnya.

std::threadSayangnya, kelas C ++ 11 tidak bekerja dengan andal (di setiap platform), bahkan jika C ++ 11 tampaknya tersedia. Misalnya di Android asli std::threadatau Win64 itu tidak berfungsi atau memiliki hambatan kinerja yang parah (pada 2012).

Pengganti yang baik adalah boost::thread- sangat mirip dengan std::thread(sebenarnya itu dari penulis yang sama) dan bekerja dengan andal, tetapi, tentu saja, ini memperkenalkan ketergantungan lain dari perpustakaan pihak ketiga.


Sunting: Pada 2017, std::threadsebagian besar bekerja pada Android asli. Beberapa kelas, seperti std::timed_mutexmasih belum diterapkan.

Piez Gunther
sumber
19
Apakah Anda memiliki bukti untuk mendukung klaim "hambatan kinerja" ini? Juga, std::threaddan raii-style-nya bagus karena bisa menangani pengecualian C ++ sementara pthreads tidak bisa keluar dari kotak.
Jesse Good
9
Sekarang di tahun 2014, apakah jawaban ini masih valid?
nonsensasi
25
Bagaimana dengan sekarang, awal 2017?
rmobis
9
Bagaimana dengan sekarang, pada 2017 Pertengahan?
Lightness Races in Orbit
14
Bagaimana dengan sekarang, pada 2018 Tengah?
陳 力
59

The std::threadperpustakaan diimplementasikan di atas pthreads dalam lingkungan yang mendukung pthreads (misalnya: libstdc ++).

Saya pikir perbedaan besar antara keduanya adalah abstraksi. std::threadadalah pustaka kelas C ++. The std::threadperpustakaan mencakup banyak fitur yang abstrak, misalnya: kunci scoped, mutexes rekursif, masa depan / janji implementasi pola desain, dan banyak lagi.

Akira Takahashi
sumber
4
+1dari saya untuk menunjukkan hal yang paling penting, yaitu std :: thread memberikan tingkat abstraksi yang lebih tinggi.
sbi
33

std::thread memberikan portabilitas di berbagai platform seperti Windows, MacOS, dan Linux.

Seperti yang disebutkan oleh @hirshhornsalz dalam komentar di bawah dan jawaban terkait https://stackoverflow.com/a/13135425/1158895 , std::threadmungkin belum lengkap di semua platform. Meski begitu, (itu akan dalam waktu dekat) itu harus disukai lebih pthreaddari itu karena harus membuat aplikasi Anda lebih tahan masa depan.

Brady
sumber
2
sebenarnya, std :: threads menyediakan portabilitas di semua platform yang mendukung C ++ 11, sedangkan thread POSIX hanya tersedia pada platform POSIX (atau platform yang berusaha untuk kompatibilitas yang minimal).
Tobias Langner
1
Dari POV praktis ini salah. Saya sebenarnya memutuskan beberapa bulan lalu tentang alasan ini - itu adalah kesalahan besar. Dalam praktiknya Anda harus menggunakan boost::threadWin64 atau Bionic (Android), karena std::threadmasih kekurangan bagian besar, di mana pada Linux std::threadsepertinya cukup matang.
Gunther Piez
1
@hirschhornsalz, inti dari jawaban saya adalah untuk menunjukkan manfaat portabilitas yang diberikan oleh implementasi thread c ++ 11 dibandingkan dengan pthread. OP tidak bertanya tentang peningkatan, tetapi portabel juga.
Brady
3
@hirschhornsalz, untuk nada negatif dan tuduhan Anda tidak pernah menggunakan utas, mereka hanya tidak konstruktif dan tidak pantas diusahakan oleh saya. Saya pikir itu setidaknya bernilai sambil menyebutkan bahwa komentar yang lebih konstruktif akan menunjukkan masalah yang Anda coba gunakan std :: thread pada platform yang berbeda.
Brady
3
Untuk meringkas, c ++ 11 std :: thread hanya dapat digunakan dengan versi GCC terbaru. Ini hampir tidak lengkap di Visual Studio, oleh karena itu tidak dapat digunakan pada Windows. Dan tentu saja itu benar-benar hilang dalam kompiler komersial pada UNIXes (Sun Studio on Solaris, HP aCC pada HP-UX, IBM vacpp pada AIX). Karena itu, jika platform target Anda hanya Linux - c ++ 11 std :: thread baik-baik saja; jika Anda juga membutuhkan Windows atau UNIX lainnya - boost :: thread adalah caranya.
vond
7

Bagi saya perbedaan teknis yang menentukan adalah tidak adanya penanganan sinyal primitif di std sebagai lawan dari pthreads. Ketidakmampuan untuk mendikte penanganan sinyal dengan benar dalam proses Unix menggunakan std saja adalah AFAIK cacat yang melemahkan dalam penggunaan std :: thread karena mencegah seseorang mengatur pola penanganan sinyal multi-ulir yang bonafid untuk memproses semua sinyal dalam dedicated utas dan blokir sisanya. Anda dipaksa untuk menganggap std :: thread diimplementasikan menggunakan pthreads dan berharap yang terbaik saat menggunakan pthread_sigmask. Menangani sinyal dengan benar tidak dapat dinegosiasikan dalam pemrograman sistem Unix untuk perusahaan.

Pada 2016, std :: thread adalah mainan; sederhana seperti itu.

Waslap
sumber
7
Saya tidak setuju. Dan penggunaan sinyal yang berat adalah pola desain yang dapat dihindari untuk sebagian besar aplikasi.
Erik Alapää
Juga, std::threadbawa keamanan jenis yang tidak dimiliki pthread.
alfC
-3

OpenMP

http://www.openmp.org/

adalah standar, multithreading standar SMP yang telah bekerja di Linux dan Windows selama lebih dari satu dekade. OpenMP tersedia secara default dengan semua kompiler, termasuk GCC dan Microsoft Visual Studio.

Satu hal yang harus diperhatikan, ketika menggunakan OpenMP, adalah bahwa jika ada lebih banyak thread daripada CPU-core, maka kinerjanya akan turun karena konteks switching overhead yang terkait. Hal kedua yang perlu diingat adalah bahwa inisialisasi thread, level sistem operasi aktual, relatif mahal. Inisialisasi adalah sepersekian detik, tetapi dalam beberapa aplikasi fraksi yang sangat kecil terakumulasi dengan biaya yang cukup besar.

Untuk persyaratan arsitektur terkait konkurensi perangkat lunak, Anda mungkin ingin mencari beberapa implementasi "utas ringan" atau "utas hijau" sebagai pengganti penggunaan OpenMP. Perbedaannya adalah bahwa utas OpenMP sebenarnya, tingkat sistem operasi, utas, tetapi "utas hijau" bisa jadi hanya "untaian simulasi" yang dijalankan dengan menggunakan sejumlah kecil untaian nyata.

Martin Vahi
sumber
6
Tidak ada rasa tidak hormat, tetapi bagaimana ini terkait dengan pertanyaan utama?
SRG