Mengapa saya harus memilih satu atau yang lain dalam praktik? Apa perbedaan teknis kecuali itu std::thread
kelas?
std::thread
terjadi
std::thread
atau pthreads
tidak.
Mengapa saya harus memilih satu atau yang lain dalam praktik? Apa perbedaan teknis kecuali itu std::thread
kelas?
std::thread
terjadi
std::thread
atau pthreads
tidak.
Jawaban:
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::thread
baik-baik saja - ia memiliki tingkat abstraksi yang lebih tinggi, antarmuka yang sangat bagus dan bermain baik dengan kelas C ++ 11 lainnya.
std::thread
Sayangnya, kelas C ++ 11 tidak bekerja dengan andal (di setiap platform), bahkan jika C ++ 11 tampaknya tersedia. Misalnya di Android asli std::thread
atau 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::thread
sebagian besar bekerja pada Android asli. Beberapa kelas, seperti std::timed_mutex
masih belum diterapkan.
std::thread
dan raii-style-nya bagus karena bisa menangani pengecualian C ++ sementara pthreads tidak bisa keluar dari kotak.
The std::thread
perpustakaan diimplementasikan di atas pthreads dalam lingkungan yang mendukung pthreads (misalnya: libstdc ++).
Saya pikir perbedaan besar antara keduanya adalah abstraksi. std::thread
adalah pustaka kelas C ++. The std::thread
perpustakaan mencakup banyak fitur yang abstrak, misalnya: kunci scoped, mutexes rekursif, masa depan / janji implementasi pola desain, dan banyak lagi.
+1
dari saya untuk menunjukkan hal yang paling penting, yaitu std :: thread memberikan tingkat abstraksi yang lebih tinggi.
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::thread
mungkin belum lengkap di semua platform. Meski begitu, (itu akan dalam waktu dekat) itu harus disukai lebih pthread
dari itu karena harus membuat aplikasi Anda lebih tahan masa depan.
boost::thread
Win64 atau Bionic (Android), karena std::thread
masih kekurangan bagian besar, di mana pada Linux std::thread
sepertinya cukup matang.
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.
std::thread
bawa keamanan jenis yang tidak dimiliki pthread.
OpenMP
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.
std::async