c – 未处理的异常访问冲突在Mutex示例中写入位置

c – 未处理的异常访问冲突在Mutex示例中写入位置,第1张

概述我正在通过使用互斥体来保护全局双重的例子,但是我收到错误 – Unhandled exception at 0x77b6308e in Lab7.exe: 0xC0000005: Access violation writing location 0x00000068. 我认为这与访问得分有关? (全球双倍) #include <windows.h>#include <iostream> 我正在通过使用互斥体来保护全局双重的例子,但是我收到错误 –

Unhandled exception at 0x77b6308e in
Lab7.exe: 0xC0000005: Access violation
writing location 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,MyThread,NulL,NulL);     }    WaitForMultipleObjects(10,threads,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,因为我添加它们时会重现该错误.

解决方法 您的代码中的剩余错误是在调用WaitForMultipleObjects().您将第3个参数设置为0(FALSE),以使主线程在10个线程中的任一个完成时解除阻塞.

这导致在所有线程完成之前执行DeleteCriticalSection()的调用,当其中一个(可能)9个其他线程启动并调用EnterCriticalSection()时,会创建访问冲突.

总结

以上是内存溢出为你收集整理的c – 未处理的异常/访问冲突在Mutex示例写入位置全部内容,希望文章能够帮你解决c – 未处理的异常/访问冲突在Mutex示例中写入位置所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1248283.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存