Я работаю над примером защиты глобального двойника с помощью мьютексов, однако получаю сообщение об ошибке -
Необработанное исключение по адресу 0x77b6308e в Lab7.exe: 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);
}
Обновление:
После устранения проблемы с установкой цикла на 1000 вместо 10 ошибка все еще возникала, однако, когда я закомментировал фрагменты кода, относящиеся к мьютексу, ошибка не возникла. происходят.
CRITICAL_SECTION score_mutex;
EnterCriticalSection(&score_mutex);
LeaveCriticalSection(&score_mutex);
InitializeCriticalSection(&score_mutex);
DeleteCriticalSection(&score_mutex);
Обновление 2
В соответствии с соглашением потоки возвращают 0 (это была долгая неделя!)
Я попытался добавить обратно в код, связанный с мьютексом, и программа будет компилироваться и работать нормально (кроме гонки конечно, проблемы с состоянием двойника) с CRITICAL_SECTION, InitializeCriticalSection и DeleteCriticalSection, все добавленные обратно. Проблема, похоже, связана с EnterCriticalSection или LeaveCriticalSection, поскольку ошибка повторяется, когда я их добавляю.