C ++ 14 std::mutexkilitli olup olmadığını kontrol etmek için bir mekanizma atlamış görünüyor . Bu SO soruya bakın:
https://stackoverflow.com/questions/21892934/how-to-assert-if-a-stdmutex-is-locked
Bunun etrafında birkaç yol vardır, örneğin;
std::mutex::try_lock()
std::unique_lock::owns_lock()
Ancak bunların hiçbiri özellikle tatmin edici çözümler değil.
try_lock()Geçerli iş parçacığı mutex'i kilitledi, yanlış bir negatif döndürmek için izin verilir ve tanımsız davranışa sahip. Aynı zamanda yan etkileri vardır. Orijinalin üstüne owns_lock()bir yapı gerektirir .unique_lockstd::mutex
Açıkçası kendime gelebilirdim, ancak mevcut arayüz için motivasyonları anlamayı tercih ederim.
Bir muteksin durumunu (örn. std::mutex::is_locked()) Kontrol etme yeteneği bana ezoterik bir istek gibi görünmüyor, bu yüzden Standart Komitenin gözetimden ziyade kasıtlı olarak bu özelliği atladığından şüpheleniyorum.
Niye ya?
Düzenleme: Tamam, belki de bu kullanım durumu beklediğim kadar yaygın değil, bu yüzden kendi senaryomu göstereceğim. Birden fazla iş parçacığı üzerinde dağıtılmış bir makine öğrenme algoritmasına sahibim. Her iş parçacığı eşzamansız çalışır ve bir optimizasyon sorunu tamamladıktan sonra ana havuza geri döner.
Daha sonra bir ana muteksi kilitler. İplik daha sonra, bir çocuğu mutasyona uğratmak için yeni bir ebeveyn seçmelidir, ancak yalnızca şu anda başka iplikler tarafından optimize edilmiş yavrulara sahip olmayan ebeveynlerden seçim yapabilir. Bu nedenle, şu anda başka bir iş parçacığı tarafından kilitlenmemiş ebeveynleri bulmak için bir arama yapmam gerekiyor. Ana iş parçacığı muteks kilitli olduğundan, arama sırasında değişen muteks durumunun riski yoktur. Açıkçası başka çözümler var (şu anda bir boolean bayrağı kullanıyorum) ancak mutex'in dişler arası senkronizasyon amacıyla olduğu gibi bu soruna mantıklı bir çözüm sunduğunu düşündüm.
is_locked?