1

私のアプリでは、2 つのスレッドが同じ再帰関数を呼び出し、データを何らかのファイルに出力する必要があります。このスレッドを同期して正しいデータを出力する方法がわかりません。ミューテックスを使用していくつかのバリアントを試してみました (/ ** n ** / を使用してコードでコメントされています) が、機能しません (出力データは異なるスレッドから混合されています)。同期を整理するにはどうすればよいですか (WinAPI と std のみを使用する必要があります)。以下の疑似コード:

HANDLE hMutex = CreateMutex(NULL,FALSE, 0);
wchar_t** HelpFunction(wchar_t const* p, int *t)
{
    do
    {
        /**** 1 ****/ //WaitForSingleObject(hMutex, INFINITE);
        wchar_t* otherP= someFunction();
        if(...)
        {
            /**** 2 ****/ //WaitForSingleObject(hMutex, INFINITE);
            //File's output should be here
            //Outputing p
            /**** 2 ****/ //ReleaseMutex(hMutex);
        }
        if(...)
        {
            HelpFunction(otherP, t);
        }
        /**** 1 ****/ //ReleaseMutex(hMutex);
    }while(...);
}
unsigned int WINAPI ThreadFunction( void* p)
{
    int t = 0;
    /**** 3 ****/ //WaitForSingleObject(hMutex, INFINITE);
    wchar_t** res = HelpFunction((wchar_t *)p, &t);
    /**** 3 ****/ //ReleaseMutex(hMutex);
    return 0;
}
void _tmain()
{
    HANDLE hThreads[2];
    hThreads[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, L"param1", 0, NULL);
    hThreads[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, L"param2", 0, NULL);
    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
}
4

1 に答える 1

1

Windows API では、それが単一のプロセスである場合は、クリティカル セクションを使用した方がよいでしょう。

クリティカル セクションに WaitForSingleObject は必要ありません。データが書き込まれるのを待っているときにのみ使用します。

そして、あなたが同期していると思うのはファイル書き込みであるため、各スレッドは一度に1つのレコード全体を書き込みます。(すべてのバッファをフラッシュすることを確認してください)。

あなたは電話します

EnterCriticalSection

敏感な部分に到達すると

LeaveCriticalSection

敏感な部分の最後に。

API の詳細については、こちらをご覧ください。

再帰する時点で「ロック」を保持していない限り、つまり、クリティカル セクション コード内から再帰しない限り、ここでは再帰は問題になりません。示されているコードのように再帰すると、新しいスレッドは生成されません。あなたがそれを期待していたかどうかはわかりません。

HelpFunction で実際にファイル I/O を確認できません。ただし、t と呼ばれるポインターは表示されます。これは両方のスレッドで同じポインターであり、const ではありません。したがって、両方のスレッドがその int に書き込む場合は、それも同期する必要がある場合があります。繰り返しますが、コードは実際にそのポインターがどのように使用されているかを示していません。

于 2012-10-19T08:35:58.003 に答える