C ++ 14 tampaknya telah menghilangkan mekanisme untuk memeriksa apakah suatu std::mutex
terkunci atau tidak. Lihat pertanyaan SO ini:
/programming/21892934/how-to-assert-if-a-stdmutex-is-locked
Ada beberapa cara untuk mengatasi hal ini, misalnya dengan menggunakan;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Tapi tak satu pun dari ini adalah solusi yang memuaskan.
try_lock()
diizinkan untuk mengembalikan negatif palsu dan memiliki perilaku tidak terdefinisi jika utas saat ini telah mengunci mutex. Ini juga memiliki efek samping. owns_lock()
membutuhkan konstruksi unique_lock
di atas yang asli std::mutex
.
Jelas saya bisa menjalankan sendiri, tetapi saya lebih suka memahami motivasi untuk antarmuka saat ini.
Kemampuan untuk memeriksa status mutex (misalnya std::mutex::is_locked()
) tidak tampak seperti permintaan esoterik bagi saya, jadi saya curiga Komite Standar sengaja menghapus fitur ini daripada menjadi pengawasan.
Mengapa?
Sunting: Oke jadi mungkin ini kasus penggunaan tidak biasa seperti yang saya harapkan, jadi saya akan menggambarkan skenario khusus saya. Saya memiliki algoritma pembelajaran mesin yang didistribusikan pada banyak utas. Setiap utas beroperasi secara tidak sinkron, dan kembali ke kumpulan induk setelah menyelesaikan masalah optimisasi.
Ini kemudian mengunci mutex master. Utas kemudian harus memilih induk baru untuk dimutasi dari keturunan, tetapi hanya dapat memilih dari induk yang saat ini tidak memiliki keturunan yang sedang dioptimalkan oleh utas lainnya. Karena itu saya perlu melakukan pencarian untuk menemukan orang tua yang saat ini tidak dikunci oleh utas lainnya. Tidak ada risiko status mutex berubah selama pencarian, karena master thread mutex dikunci. Jelas ada solusi lain (saya saat ini menggunakan bendera boolean) tapi saya pikir mutex menawarkan solusi logis untuk masalah ini, karena ada untuk keperluan sinkronisasi antar-thread.
is_locked
?