std::mutex
は非再帰的であり、その違反はUBです。したがって、理論的には何でも可能です(として動作することを含むstd::recursive_mutex
))が、libc ++は正常に動作しているようです、このプログラムは出力します
さようなら
#include <iostream>
#include <mutex>
std::mutex m;
int main() {
std::scoped_lock l1(m);
std::scoped_lock l2(m);
std::cout << "bye" << std::endl;
}
これはlibc ++での意図的な設計上の決定ですか、それとも単なる偶然ですか(たとえば、ミューテックスとrecursive_mutexに同じロジックを使用できます)?
libstdc ++がハングします。
注:私は、人々がUBに依存すべきではないことを認識しています。したがって、これはベストプラクティスに関するものではなく、実装の詳細があいまいなことに興味があります。
反対の結果が得られます:libc ++はハングし、libstdc ++はハングしません
その理由は、ファイルがでコンパイルされていない場合-pthread
、スレッドサポートが無効になり、std::mutex::lock
/unlock
がnoopsになるためです。追加-pthread
すると、期待どおりに両方がデッドロックになります。
libc ++はデフォルトでスレッドサポートを使用して構築されており、-pthread
フラグを必要としないため、std::mutex::lock
実際にはロックを取得してデッドロックを作成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加