ミューテックスを使用してグローバルダブルを保護する例に取り組んでいますが、エラーが発生します-
Lab7.exe の 0x77b6308e で未処理の例外: 0xC0000005: アクセス違反の書き込み場所 0x00000068。
これはスコアへのアクセスに関連していると思いますか?(グローバルダブル)
#include <windows.h>
#include <iostream>
#include <process.h>
double score = 0.0;
HANDLE threads[10];
CRITICAL_SECTION score_mutex;
unsigned int __stdcall MyThread(void *data)
{
EnterCriticalSection(&score_mutex);
score = score + 1.0;
LeaveCriticalSection(&score_mutex);
return 0;
}
int main()
{
InitializeCriticalSection(&score_mutex);
for (int loop = 0; loop < 10; loop++)
{
threads[loop] = (HANDLE) _beginthreadex(NULL, 0, MyThread, NULL, 0, NULL);
}
WaitForMultipleObjects(10, threads, 0, INFINITE);
DeleteCriticalSection(&score_mutex);
std::cout << score;
while(true);
}
アップデート:
ループが 10 ではなく 1000 に設定されている問題を修正した後もエラーが発生しましたが、ミューテックスを参照するコードをコメントアウトしたところ、エラーは発生しませんでした。
CRITICAL_SECTION score_mutex;
EnterCriticalSection(&score_mutex);
LeaveCriticalSection(&score_mutex);
InitializeCriticalSection(&score_mutex);
DeleteCriticalSection(&score_mutex);
更新 2
慣習に従って、スレッドは 0 を返します (長い 1 週間でした!)
私はミューテックス関連のコードを追加しようとしましたが、CRITICAL_SECTION、InitializeCriticalSection、およびDeleteCriticalSectionがすべて追加された状態で、プログラムはコンパイルされて正常に実行されます(もちろんダブルの競合状態の問題を除く)。問題はEnterCriticalSectionにあるようですまたは LeaveCriticalSection を追加するとエラーが再発するためです。