我正在研究使用互斥锁保护全局双精度的示例,但是出现错误-
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);
}
更新:
在解决了将循环设置为 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,因为当我添加它们时错误再次发生。