c++ pemrosesan multithread lambat

Saya memiliki beberapa thread konsumen dan satu thread produsen. Thread produsen menulis data ke dalam peta milik thread konsumen tertentu dan mengirimkan sinyal ke thread konsumen. Saya menggunakan mutex di sekitar peta ketika saya memasukkan dan menghapus data. namun pendekatan ini terlihat tidak efisien dalam hal performa kecepatan. Bisakah Anda menyarankan pendekatan lain selain peta yang memerlukan mutex mengunci dan membuka kunci dan menurut saya mutex memperlambat transmisi.


person Avb Avb    schedule 27.09.2013    source sumber


Jawaban (2)


namun pendekatan ini terlihat tidak efisien dalam hal performa kecepatan. Bisakah Anda menyarankan pendekatan lain selain peta yang memerlukan mutex mengunci dan membuka kunci dan menurut saya mutex memperlambat transmisi.

Anda harus menggunakan profiler untuk mengidentifikasi di mana letak hambatannya.


Thread produsen menulis data ke dalam peta milik thread konsumen tertentu dan mengirimkan sinyal ke thread konsumen.

Produsen tidak perlu memikirkan jenis struktur data yang digunakan konsumen - ini adalah detail implementasi konsumen. Perlu diingat bahwa memasukkan nilai ke dalam peta memerlukan alokasi memori (kecuali jika Anda menggunakan pengalokasi khusus) dan alokasi memori secara internal juga memerlukan kunci untuk melindungi status heap. Hasil akhirnya adalah mengunci mutex di sekitar operasi map::insert sebenarnya mungkin menguncinya terlalu lama.

Desain yang lebih sederhana dan efisien adalah dengan memiliki antrian atomik antara produsen dan konsumen (misalnya pipa, TBB concurrent_bounded_queue yang mengalokasikan penyimpanannya terlebih dahulu sehingga operasi push/pop menjadi sangat cepat). Karena produser Anda berkomunikasi langsung dengan setiap konsumen bahwa antreannya adalah satu-penulis-satu-pembaca dan dapat diimplementasikan sebagai antrean bebas tunggu (atau ring buffer ala pengganggu C++).

person Maxim Egorushkin    schedule 27.09.2013
comment
Bisakah Anda menyarankan beberapa contoh implementasi antrian ini? Apakah itu standar di STL atau di tempat lain? Apakah maksud Anda std::atom? - person Avb Avb; 27.09.2013
comment
@AvbAvb Saya menambahkan beberapa referensi. - person Maxim Egorushkin; 27.09.2013

Andrei Alexandrescu menyampaikan poin bagus bahwa Anda harus mengukur kode Anda (https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920) dan ini adalah saran yang sama yang akan saya berikan kepada Anda, yaitu mengukur kode Anda dan lihat perbedaan performa yang Anda peroleh antara pengujian dasar dan pengujian yang menjalankan thread tunggal:

  1. Waktu yang diperlukan untuk memasukkan data menggunakan utas tunggal untuk memetakan dengan data yang tercantum di atas
  2. Waktu yang diperlukan untuk memasukkan data menggunakan utas tunggal untuk memetakan dengan data yang tercantum di atas dan menggunakan kunci mutex

Jika Anda masih mencari container yang aman untuk thread, Anda mungkin ingin melihat penerapan sumber terbuka Intel atas wadah yang aman untuk thread di http://www.threadingbuildingblocks.org/docs/help/reference/containers_overview/concurrent_queue_cls.htm .

Selain itu, sebagai saran untuk implementasi thread konsumen, Anda mungkin ingin membaca artikel ActiveObject yang Herb Sutter posting di situs webnya: http://herbsutter.com/2010/07/12/Effective-concurrency-prefer-using-active-objects-instead-of-naked-threads/

Jika Anda dapat memberikan beberapa detail lebih lanjut, seperti mengapa peta harus dikunci sepanjang waktu, kami mungkin dapat menyusun mekanisme yang memiliki kinerja lebih baik.

person AhiyaHiya    schedule 27.09.2013