Место записи необработанного исключения / нарушения прав доступа в примере Mutex

Я работаю над примером защиты глобального двойника с помощью мьютексов, однако получаю сообщение об ошибке -

Необработанное исключение по адресу 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, поскольку ошибка повторяется, когда я их добавляю.

9
задан Doug T. 12 May 2011 в 15:19
поделиться