3

スレッドに WinAPI を使用するコードを、新しい標準スレッド ライブラリを使用するように書き直しています。

ミューテックスが放棄または失われたことに気付くために、C++ 11で同等の方法は何だろうと思っていました。

次のコードは、作成されたスレッドに初期化手順を「アウトソーシング」する必要がありますが、それが完了して初期化の結果がわかるまで戻るべきではありません。

bool Foo::Example()
{
    m_thread = std::thread(&Foo::ThreadProc, this);

    // wait for event before waiting for mutex
    WaitForSingleObject(m_hEvent, INFINITE);
    ResetEvent(m_hEvent);

    // the thread aquired the mutex. now wait until it is released or abandoned
    DWORD ret = WaitForSingleObject(m_hMutex, INFINITE);
    ReleaseMutex(m_hMutex);

    // check the result
    if (ret == WAIT_ABANDONED)
        return false;
    return true;
}
void Foo::ThreadProc()
{
    // aquire mutex and signal that it's done
    WaitForSingleObject(m_hMutex, INFINITE);
    SetEvent(m_hEvent);

    // ... initialization (required to be in this thread)

    if (initializationfailure)
        return; // failure. mutex is abandoned

    // success. mutex is unlocked
    ReleaseMutex(m_hMutex);

    // ... do the work
}

WAIT_ABANDONED チェックの代わりになるものは何ですか? std::mutex には何も見つかりませんでした。同等のものはThe behavior is undefined if the mutex is not unlocked before being destroyed, i.e. some thread still owns it.ありませんか?これに近い std スレッド ライブラリに何かありますか?

また、コードを改善するための提案も受け付けています。このような単純なタスクには同期が多すぎるようです。

4

1 に答える 1