Kemungkinan bug pada std::shared_mutex di Windows
- Sebuah tim perangkat lunak menemukan perilaku tak terduga yang terkait dengan
std::shared_mutex di Windows.
- Masalah ini hanya terjadi di MSVC, dan tidak muncul di MinGW atau platform lain.
- Ketika thread utama memperoleh lock eksklusif lalu beberapa thread anak mencoba memperoleh lock bersama, "deadlock" terjadi kira-kira 1 dari 1000 kali.
- Saat deadlock terjadi, tepat 1 thread anak saja yang berhasil memperoleh lock bersama, sementara thread anak lainnya terblokir selamanya di
lock_shared().
- Masalah ini diamati saat menggunakan
std::shared_mutex, std::shared_lock/std::unique_lock, maupun saat memanggil fungsi SRW secara langsung.
Contoh kode dan reproduksi bug
- Disediakan kode sederhana yang dapat mereproduksi masalah ini.
- Kode tersebut mengulangi proses di mana thread utama memperoleh lock eksklusif, lalu beberapa thread anak memperoleh lock bersama dan kemudian melepaskannya.
- Kode ini menunjukkan bug terkait
std::shared_mutex hanya pada implementasi Windows MSVC.
Pendapat para ahli
- Pengembang STL menyebut bahwa masalah ini tampak seperti bug pada Windows API.
- Ada diskusi mengenai langkah yang tepat untuk melaporkan bug ini, dan pengembang STL melaporkannya secara internal.
- Pengguna lain meneliti masalah ini lebih rinci dan berkontribusi mempersempit dugaan ke bug spesifik pada implementasi SRWLock.
Opini GN⁺
- Artikel ini memberikan informasi yang sangat penting khususnya bagi pengembang C++, karena potensi bug pada
std::shared_mutex dapat memengaruhi mekanisme sinkronisasi pada aplikasi multithreading.
- Jika bug ini terkonfirmasi, hal itu dapat memengaruhi tingkat kepercayaan terhadap implementasi pustaka standar C++. Pengembang perlu menyadari masalah seperti ini dan mungkin perlu mempertimbangkan mekanisme sinkronisasi alternatif.
- Masalah ini bisa menjadi sangat penting terutama pada sistem berkinerja tinggi atau sistem real-time, karena deadlock dapat menimbulkan konsekuensi yang fatal.
- Sebelum mengadopsi teknologi ini, pengembang perlu melakukan pengujian ekstensif pada platform dan compiler terkait untuk memastikan tidak ada bug semacam ini.
- Untuk mengatasi masalah seperti ini, pengembang dapat mempertimbangkan pustaka sinkronisasi alternatif seperti Boost. Karena Boost telah diuji secara luas dan digunakan di banyak platform, pustaka ini dapat menjadi alternatif yang stabil untuk masalah semacam ini.
1 komentar
Opini Hacker News
Seorang pengguna penasaran mengapa masalah yang mendasar ini tidak terdeteksi dalam waktu yang lama, sambil menyebut jawaban meyakinkan yang diberikan pengguna lain. Ia menunjukkan bahwa ada kasus ketika thread yang mencoba mengunci dalam mode bersama bisa secara keliru memperoleh kunci dalam mode eksklusif. Ini terjadi karena tumpang tindih operasi atomik pengujian bit dan penetapan saat thread pengambil mode bersama dan thread pelepas mode eksklusif berjalan secara bersamaan.
Pengguna lain menyebut bahwa ia tidak terkejut dengan bug halus yang muncul pada kunci Reader/Writer, dan membagikan pengalamannya mengerjakan implementasi internal berbasis Win32 sebelum C++11 dan std::shared_mutex. Ia mengatakan berusaha menghindari kunci bersama kecuali benar-benar diperlukan karena pengalaman buruk dengannya.
Seorang pengguna menunjukkan bahwa judulnya menyesatkan, dan menjelaskan bahwa bug sebenarnya ada pada kunci slim reader/writer (SRW) di Windows API, dan ditemukan karena std::shared_mutex diimplementasikan menggunakan kunci SRW. Seorang karyawan Microsoft mengonfirmasi bahwa bug tersebut telah diajukan secara internal ke tim Windows API.
Seorang pengguna penasaran apakah masalah yang sama juga terjadi pada implementasi WINE, dan menyebut ingin mengujinya juga pada instalasi XP kustom miliknya. Ia mengatakan telah menambahkan berbagai ekstensi termasuk API SRW ke instalasi itu, dan menambal kernel untuk memperbaiki race condition yang menyebabkan deadlock pada API keyed event yang dibangun di atas implementasi SRW.
Ditunjukkan bahwa program tersebut memiliki bug. Program itu mencampurkan variabel non-atomic dan atomic untuk digunakan dalam loop pemeriksaan yield(), dan variabel non-atomic tidak menjamin koherensi cache terhadap thread lain. Akibatnya, loop tersebut bisa berjalan selamanya.
Seorang pengguna menyebut bahwa bug ini berakar setidaknya sampai versi Vista tahun 2008, dan mengungkapkan keterkejutannya bahwa tidak seorang pun menemukan bug ini selama waktu selama itu. Ia menyebut bahwa pada penggunaan rwlock yang umum, kasus acak gagal memperoleh kunci bersama bisa terjadi, tetapi deadlock tidak terjadi.
Seorang pengguna menyebut bahwa melaporkan bug pada Windows API sangat sulit, dan mengkritik arahan untuk melaporkannya lewat Feedback Hub karena hampir tidak efektif. Pengguna tersebut melaporkan bug bahwa SRWLOCK bisa mengalami deadlock saat beberapa thread pembaca mencoba memperoleh kepemilikan bersama setelah pemilik eksklusif melepaskan kepemilikannya.
Seorang pengguna mengenang bahwa dulu saat membeli produk MS, seseorang bisa mendapatkan support incident, dan jika menemukan bug nyata maka support incident itu akan dikembalikan. Ia menyebut ini sebagai sistem yang baik karena bermanfaat bagi pengembang sekaligus memberi MS umpan balik untuk menemukan masalah nyata dan memperbaiki dokumentasi. Ia penasaran apakah program ini masih ada.
Terakhir, seorang pengguna mengungkapkan kekecewaan terhadap sulitnya melaporkan bug pada Windows API.