【发布时间】:2011-08-24 04:55:24
【问题描述】:
我正在研究一个使用互斥锁保护全局双精度的示例,但是我得到了错误 -
在 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 一起使用,因为当我添加它们时错误再次发生。
【问题讨论】:
-
注意:按照惯例,如果线程没有错误终止,则返回代码为0。
-
您是否检查过任何调用函数的返回值? 始终检查 C API 函数的错误代码。这是您应该采取的第一步,尤其是当您发生崩溃时!
-
谢谢你 - 我应该想到的 - 这是漫长的一周!
-
找到你的错误,看看我的答案。
-
@ShimmerGeek:最后你不需要一个繁忙的循环
while(true);。WaitForMultipleObjects等待所有辅助线程,使主线程不退出。
标签: c++ multithreading winapi critical-section waitformultipleobjects