1

ミューテックスを使用してコードのセクションを保護しようとしています。コードがクラッシュしたため、同じことを行う簡単なテスト コードを以下に作成しました。クラッシュは毎回同じコード行で発生するとは限りませんが、常に "WaitForSingleObject" または "Sleep" 呼び出しの前後で発生します。

任意の支援をいただければ幸いです。

#include <thread>
#include <windows.h>
#include <process.h>

static HANDLE myMutex;

//The function we want to make the thread run.
void task1()
{

    WaitForSingleObject(myMutex, INFINITE);

    for (int i = 0; i < 20; i++)
    {
        Sleep(500);
    }

    ReleaseMutex(myMutex);
}

void task2()
{

    Sleep(10);
    WaitForSingleObject(myMutex, INFINITE);

    for (int i = 0; i < 20; i++)
    {
        Sleep(10);
    }

    ReleaseMutex(myMutex);
}

int main(int argc, char **argv)
{

    myMutex = CreateMutex(0, FALSE, 0);

    std::thread t1(task1);

    std::thread t2(task2);
}
4

1 に答える 1

4

main問題は、メソッドが終了する前にスレッドが終了するのを待っていないことです。オブジェクトのデストラクタはthread、スレッドが終了せずに呼び出されています。joinメイン メソッドを待機させるには、呼び出す必要があります。試す:

int main(int argc, char **argv)
{

    myMutex = CreateMutex(0, FALSE, 0);

    std::thread t1(task1);

    std::thread t2(task2);
    if(t1.joinable())
        t1.join();

    if(t2.joinable())
        t2.join();

}

std::thread デストラクタのドキュメントによると:

スレッド オブジェクトを破棄します。*これに関連する実行中のスレッドがまだある場合 (つまり、joinable() == true)、std::terminate() が呼び出されます。

于 2013-12-13T15:05:54.647 に答える