Mengapa saya harus memilih satu atau yang lain dalam praktik? Apa perbedaan teknis kecuali itu std::threadkelas?
std::threadterjadi
std::threadatau pthreadstidak.
Mengapa saya harus memilih satu atau yang lain dalam praktik? Apa perbedaan teknis kecuali itu std::threadkelas?
std::threadterjadi
std::threadatau pthreadstidak.
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::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.
std::threaddan raii-style-nya bagus karena bisa menangani pengecualian C ++ sementara pthreads tidak bisa keluar dari kotak.
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.
+1dari 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::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.
boost::threadWin64 atau Bionic (Android), karena std::threadmasih kekurangan bagian besar, di mana pada Linux std::threadsepertinya 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::threadbawa 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