Motivasi: alasan mengapa saya mempertimbangkannya adalah bahwa manajer proyek jenius saya berpikir bahwa dorongan adalah ketergantungan lain dan itu mengerikan karena "Anda bergantung padanya" (Saya mencoba menjelaskan kualitas dorongan, kemudian menyerah setelah beberapa waktu :( Alasan yang lebih kecil mengapa saya ingin melakukannya adalah karena saya ingin mempelajari fitur c ++ 11, karena orang akan mulai menulis kode di dalamnya.
- Apakah ada pemetaan 1: 1 antara
#include<thread> #include<mutex>
dan tingkatkan setara? - Apakah Anda mempertimbangkan ide yang baik untuk mengganti barang tambahan dengan c ++ 11
barang. Penggunaan saya primitif, tetapi apakah ada contoh ketika std tidak menawarkan peningkatan apa yang dilakukan? Atau (penghujatan) sebaliknya?
PS Saya menggunakan GCC jadi ada header.
Jawaban:
Ada beberapa perbedaan antara Boost.Thread dan pustaka utas standar C ++ 11:
std::async
, tetapi Boost tidakboost::shared_mutex
penguncian untuk banyak pembaca / penulis tunggal. Analog yangstd::shared_timed_mutex
hanya tersedia sejak C ++ 14 ( N3891 ), sementarastd::shared_mutex
hanya tersedia sejak C ++ 17 ( N4508 ).boost::unique_future
vsstd::future
)std::thread
berbeda denganboost::thread
--- Meningkatkan penggunaanboost::bind
, yang membutuhkan argumen yang dapat disalin.std::thread
memungkinkan tipe hanya pindahkan sepertistd::unique_ptr
untuk diteruskan sebagai argumen. Karena penggunaanboost::bind
, semantik placeholder seperti_1
dalam ekspresi terikat bersarang bisa berbeda juga.join()
ataudetach()
kemudianboost::thread
operator destruktor dan tugas akan memanggildetach()
objek utas yang sedang dihancurkan / ditugaskan. Dengan objek C ++ 11std::thread
, ini akan menghasilkan panggilan kestd::terminate()
dan membatalkan aplikasi.Untuk memperjelas poin tentang parameter hanya bergerak, berikut ini adalah C ++ 11 yang valid, dan mentransfer kepemilikan dari
int
sementarastd::unique_ptr
ke parameterf1
ketika utas baru dimulai. Namun, jika Anda menggunakanboost::thread
maka itu tidak akan berfungsi, seperti yang digunakan secaraboost::bind
internal, danstd::unique_ptr
tidak dapat disalin. Ada juga bug di pustaka thread C ++ 11 yang disediakan dengan GCC yang mencegah ini berfungsi, seperti yang digunakanstd::bind
dalam implementasi di sana juga.Jika Anda menggunakan Boost maka Anda mungkin dapat beralih ke utas C ++ 11 yang relatif tanpa rasa sakit jika kompiler Anda mendukungnya (mis. Versi terbaru GCC di linux memiliki sebagian besar-penyelesaian implementasi dari pustaka ulir C ++ 11 yang tersedia dalam
-std=c++0x
mode).Jika kompiler Anda tidak mendukung utas C ++ 11 maka Anda mungkin bisa mendapatkan implementasi pihak ketiga seperti Just :: Thread , tetapi ini masih ketergantungan.
sumber
lock
/unlock
untuk penulis vs. 'lock_shared / unlock_shared' untuk pembaca). Banyak pembaca dapat memanggil lock_share tanpa memblokir, selama tidak ada penulis yang menggunakannya.shared_mutex
docs berada di boost.org/doc/libs/1_47_0/doc/html/thread/... . Anda baik mengunci mutex sebagai bersama atau eksklusif, dan kemudian menggunakan fungsi buka kunci yang sesuai. Anda juga dapat menggunakan tipe RAII untuk melakukan ini (shared_lock
mengambil kunci baca bersama, danlock_guard
danunique_lock
mengambil kunci eksklusif). Saya sudah mencoba menjelaskan poin tentang tipe yang hanya bergerak.try_scoped_lock
fungsionalitas dicakup olehstd::unique_lock
. Ada konstruktor yang mengambil mutex danstd::try_to_lock
, dan kemudian akan memanggiltry_lock()
mutex daripadalock()
. Lihat stdthread.co.uk/doc/headers/mutex/unique_lock/…std::thread
sebagian besar dimodelkan setelahnyaboost::thread
, dengan beberapa perbedaan :Ini berasal dari 2007, sehingga beberapa poin tidak lagi valid: sekarang
boost::thread
memilikinative_handle
fungsi, dan, seperti yang ditunjukkan oleh komentator,std::thread
tidak ada pembatalan lagi.Saya tidak dapat menemukan perbedaan yang signifikan antara
boost::mutex
danstd::mutex
.sumber
std::thread
tidak memiliki pembatalan; memangboost::thread
begitu!interrupt()
untuk meningkatkan :: utas? Tampaknya juga ini proposal asli, yang berubah sejak 2007.Ada satu alasan untuk tidak bermigrasi
std::thread
.Jika Anda menggunakan tautan statis,
std::thread
menjadi tidak dapat digunakan karena bug / fitur gcc ini:Yaitu, jika Anda menelepon
std::thread::detach
ataustd::thread::join
itu akan menyebabkan pengecualian atau crash, sementaraboost::thread
berfungsi ok dalam kasus ini.sumber
libpthread.a
. Apakah Anda benar-benar yakin dengan apa yang Anda katakan?Wl,--whole-archive -lpthread -Wl,--no-whole-archive
, lihat jawaban ini misalnya stackoverflow.com/a/23504509/72178 . Tapi itu bukan cara yang sangat mudah untuk terhubunglibpthread.a
dan juga dianggap sebagai ide buruk.Kasus Perusahaan
Jika Anda menulis perangkat lunak untuk perusahaan yang perlu dijalankan pada berbagai sistem operasi sedang hingga besar dan akibatnya membangun dengan berbagai kompiler dan versi kompiler (terutama yang relatif lama) pada sistem operasi tersebut, saran saya adalah untuk menjauh dari C ++ 11 semuanya untuk saat ini. Itu berarti Anda tidak dapat menggunakan
std::thread
, dan saya akan merekomendasikan menggunakanboost::thread
.Kasus Startup Dasar / Teknologi
Jika Anda menulis untuk satu atau dua sistem operasi, Anda tahu pasti bahwa Anda hanya perlu membangun dengan kompiler modern yang sebagian besar mendukung C ++ 11 (mis. VS2015, GCC 5.3, Xcode 7), dan Anda belum tergantung pada dorongan perpustakaan, maka
std::thread
bisa menjadi pilihan yang bagus.Pengalaman saya
Saya pribadi menyukai perpustakaan yang diperkeras, banyak digunakan, sangat kompatibel, sangat konsisten seperti dorongan versus alternatif yang sangat modern. Ini terutama berlaku untuk mata pelajaran pemrograman yang rumit seperti threading. Juga, saya telah lama mengalami kesuksesan besar dengan
boost::thread
(dan meningkatkan secara umum) di berbagai lingkungan, kompiler, model threading, dll. Ketika itu pilihan saya, saya memilih boost.sumber
Dengan Visual Studio 2013
std::mutex
tampaknya berperilaku berbeda dariboost::mutex
, yang menyebabkan saya beberapa masalah (lihat pertanyaan ini ).sumber
Sehubungan dengan std :: shared_mutex ditambahkan dalam C ++ 17
Jawaban lain di sini memberikan gambaran yang sangat baik tentang perbedaan secara umum. Namun, ada beberapa masalah dengan
std::shared_mutex
peningkatan solve tersebut.Mutices mutakhir. Ini tidak ada
std::thread
. Mereka memungkinkan pembaca ditingkatkan menjadi penulis tanpa mengizinkan penulis lain masuk sebelum Anda . Ini memungkinkan Anda untuk melakukan hal-hal seperti pra-proses perhitungan besar (misalnya, pengindeksan ulang struktur data) ketika dalam mode baca, kemudian memutakhirkan untuk menulis untuk menerapkan pengindeksan ulang sementara hanya menahan kunci tulis untuk waktu yang singkat.Keadilan. Jika Anda memiliki aktivitas membaca konstan dengan
std::shared_mutex
, penulis Anda akan dikunci selama waktu yang tidak terbatas. Ini karena jika ada pembaca lain, mereka akan selalu diberi prioritas. Denganboost:shared_mutex
, semua utas pada akhirnya akan diberikan prioritas. (1) Baik pembaca maupun penulis tidak akan kelaparan.Ini adalah bahwa jika Anda memiliki sistem throughput yang sangat tinggi tanpa downtime dan pertengkaran yang sangat tinggi,
std::shared_mutex
tidak akan pernah bekerja untuk Anda tanpa secara manual membangun sistem prioritas di atasnya.boost::shared_mutex
akan bekerja di luar kotak, meskipun Anda mungkin perlu mengotak-atiknya dalam kasus tertentu. Saya berpendapat bahwastd::shared_mutex
perilaku adalah bug laten yang menunggu terjadi di sebagian besar kode yang menggunakannya.(1) The algoritma yang sebenarnya menggunakan didasarkan pada scheduler OS benang. Dalam pengalaman saya, ketika membaca jenuh, ada jeda yang lebih lama (ketika mendapatkan kunci tulis) di Windows daripada di OSX / Linux.
sumber
Saya mencoba menggunakan shared_ptr dari std bukannya boost dan saya benar-benar menemukan bug dalam implementasi gcc di kelas ini. Aplikasi saya macet karena destruktor disebut dua kali (kelas ini harus aman thread dan seharusnya tidak menghasilkan masalah seperti itu). Setelah pindah ke boost :: shared_ptr semua masalah hilang. Implementasi C ++ 11 saat ini masih belum matang.
Boost juga memiliki lebih banyak fitur. Misalnya header di versi std tidak menyediakan serializer ke aliran (mis., Cout << durasi). Boost memiliki banyak perpustakaan yang menggunakan sendiri, dll. Yang setara, tetapi tidak bekerja sama dengan versi std.
Singkatnya - jika Anda sudah memiliki aplikasi yang ditulis menggunakan boost, lebih aman untuk menyimpan kode Anda karena bukan berupaya untuk pindah ke standar C ++ 11.
sumber
shared_ptr
destructor tidak perlu benang-aman, perilaku itu tidak terdefinisi untuk memiliki satu thread mengakses objek sementara thread lain menghancurkan itu. Jika Anda merasa telah menemukan bug di shared_ptr GCC, harap laporkan , jika tidak, berdasarkan saldo probabilitas Anda salah menggunakannya.