libc ++でstd :: mutexの再帰的ロックが許可されるのはなぜですか?

NoSenseEtAl

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]

編集
0

コメントを追加

0

関連記事

分類Dev

TradingViewのPinescript-再帰が許可されないのはなぜですか?

分類Dev

std :: variantから継承するクラスでのstd :: visitの使用-libstdc ++とlibc ++

分類Dev

共有ロックでSQLサーバーの更新が許可されるのはなぜですか?

分類Dev

rust libcがstructにrepr(packed)を使用するのはなぜですか?

分類Dev

libc ++のvector <bool> :: const_referenceがboolではないのはなぜですか?

分類Dev

独立したコードブロックが許可されるのはなぜですか?

分類Dev

`libc6`が` libgcc1`に依存しているのはなぜですか?

分類Dev

/lib/libc.so.6が欠落しているのはなぜですか?

分類Dev

Kotlinの初期化ブロックで「return」が許可されないのはなぜですか?

分類Dev

なぜ 'for .. in'がクロージャで許可されているのですか?

分類Dev

Golangによって実装されたプログラムが、socket()などのlibc.so.6の関数を使用しないのはなぜですか?

分類Dev

(MSVCのSTLやlibstdc ++のように)2ではなくlibc ++を使用している場合、sizeof(std :: Variant <char>)== 8であるのはなぜですか?

分類Dev

メソッドで静的ローカルクラスが許可されないのはなぜですか?

分類Dev

rsyncでブロックサイズ> 128Kが許可されないのはなぜですか?

分類Dev

libc ++のshared_ptrの実装が、緩和される代わりに完全なメモリバリアを使用するのはなぜですか?

分類Dev

「enum of enum of enum ..」が許可されるのはなぜですか?

分類Dev

「const true = false」が許可されるのはなぜですか?

分類Dev

Rust、gethostname()std :: libcと対話する方法

分類Dev

List IndexOfで範囲外の開始インデックスが許可されるのはなぜですか?

分類Dev

EditTextボックスでプラス記号の使用が許可されるのはなぜですか

分類Dev

末尾再帰の最適化:「+」がそれを許可しないのはなぜですか?

分類Dev

「コミットされていない読み取り」分離レベルでロックが許可されるのはなぜですか?

分類Dev

「コミットされていない読み取り」分離レベルでロックが許可されるのはなぜですか?

分類Dev

libc内のメモリ割り当てが割り当てラッパーにルーティングされないのはなぜですか?

分類Dev

GHC 7.10.2でビルドされた実行可能ファイルがlibrtとlibcの両方に依存しているのはなぜですか?

分類Dev

AOSPのlibc ++。soはNDKのlibc ++ _ shared.soと同じですか?

分類Dev

このconstexpr関数でstd :: swapが許可されているのはなぜですか?

分類Dev

例外をスローしないコードでチェック例外のキャッチが許可されているのはなぜですか?

分類Dev

libcに(Ubuntuで)2つのバージョン番号があるのはなぜですか?

Related 関連記事

  1. 1

    TradingViewのPinescript-再帰が許可されないのはなぜですか?

  2. 2

    std :: variantから継承するクラスでのstd :: visitの使用-libstdc ++とlibc ++

  3. 3

    共有ロックでSQLサーバーの更新が許可されるのはなぜですか?

  4. 4

    rust libcがstructにrepr(packed)を使用するのはなぜですか?

  5. 5

    libc ++のvector <bool> :: const_referenceがboolではないのはなぜですか?

  6. 6

    独立したコードブロックが許可されるのはなぜですか?

  7. 7

    `libc6`が` libgcc1`に依存しているのはなぜですか?

  8. 8

    /lib/libc.so.6が欠落しているのはなぜですか?

  9. 9

    Kotlinの初期化ブロックで「return」が許可されないのはなぜですか?

  10. 10

    なぜ 'for .. in'がクロージャで許可されているのですか?

  11. 11

    Golangによって実装されたプログラムが、socket()などのlibc.so.6の関数を使用しないのはなぜですか?

  12. 12

    (MSVCのSTLやlibstdc ++のように)2ではなくlibc ++を使用している場合、sizeof(std :: Variant <char>)== 8であるのはなぜですか?

  13. 13

    メソッドで静的ローカルクラスが許可されないのはなぜですか?

  14. 14

    rsyncでブロックサイズ> 128Kが許可されないのはなぜですか?

  15. 15

    libc ++のshared_ptrの実装が、緩和される代わりに完全なメモリバリアを使用するのはなぜですか?

  16. 16

    「enum of enum of enum ..」が許可されるのはなぜですか?

  17. 17

    「const true = false」が許可されるのはなぜですか?

  18. 18

    Rust、gethostname()std :: libcと対話する方法

  19. 19

    List IndexOfで範囲外の開始インデックスが許可されるのはなぜですか?

  20. 20

    EditTextボックスでプラス記号の使用が許可されるのはなぜですか

  21. 21

    末尾再帰の最適化:「+」がそれを許可しないのはなぜですか?

  22. 22

    「コミットされていない読み取り」分離レベルでロックが許可されるのはなぜですか?

  23. 23

    「コミットされていない読み取り」分離レベルでロックが許可されるのはなぜですか?

  24. 24

    libc内のメモリ割り当てが割り当てラッパーにルーティングされないのはなぜですか?

  25. 25

    GHC 7.10.2でビルドされた実行可能ファイルがlibrtとlibcの両方に依存しているのはなぜですか?

  26. 26

    AOSPのlibc ++。soはNDKのlibc ++ _ shared.soと同じですか?

  27. 27

    このconstexpr関数でstd :: swapが許可されているのはなぜですか?

  28. 28

    例外をスローしないコードでチェック例外のキャッチが許可されているのはなぜですか?

  29. 29

    libcに(Ubuntuで)2つのバージョン番号があるのはなぜですか?

ホットタグ

アーカイブ