【MFC】CCriticalSection类在Release编译下调用Lock函数会报错0xC0000008

  • 问题描述
  • 方法一 CRITICAL_SECTION代替CCriticalSection
  • 方法二 使用WaitForSingleObject和ReleaseMutex()
  • 结语

问题描述

通过以下伪代码方式描述问题:
主对话框类内创建成员变量及结构体变量:

typedef struct MSG_INFO
{int a;int b;char c[10];
}MSGINFO;
MSG_INFO    m_mi;
CCriticalSection m_cs;
CMyDll      m_dll;

在DLL内有一成员变量 :

class MYDLL CMyDll
{CCriticalSection *m_pcs;MSG_INFO       *m_pmi;
}

现需要实现在DLL工程内能够对主线程内的m_mi进行赋值操作,同时为避免两边现成同时对m_mi进行操作,所以通过以下方式实现关联:

m_dll.m_pcs = &m_cs;
m_dll.m_pmi= &m_mi;

此方法在Debug下调试是可行的,但是在Release下一旦DLL内程序执行到如下代码语句时就会报错:

//DLL内处理代码
m_pcs->Lock();
//功能执行
。。。
m_pcs.Unlock();

后定位到错位位置为Lock()函数内调用API函数::EnterCriticalSection(&m_sect)时便会报错:

通过分析,个人认为导致此错误的直接原因是m_sect的值是异常导致的(未必正确)


但是后面场后过指针,或者对m_sect进行初始化,都无法解决该问题。

在无法发现根本原因,所以只能再次提供两个方法来处理此问题:

方法一 CRITICAL_SECTION代替CCriticalSection

直接声明CRITICAL_SECTION结构体来代替CCriticalSection。

CRITICAL_SECTION   m_cs;
InitializeCriticalSection(&m_cs);

然后还是通过问题描述的方式传递给DLL内成员变量,处理函数修改为:

EnterCriticalSection(m_pcs);
//功能执行
。。。
LeaveCriticalSection(m_pcs);

方法二 使用WaitForSingleObject和ReleaseMutex()

主对话框内定义成员变量并对其进行初始化:

HANDLE m_hMutex;
m_hMutex = CreateMutex(NULL,FALSE,NULL); //第二个参数为FALSEE,互斥对象的所有权为空,处于空闲状态//第二个参数为TRUE,互斥对象的所有权为主线程所有,非空闲状态
//DLL传递参数
m_dll.m_hMutex = m_hMutex;

DLL内处理函数修改为:

WaitForSingleObject(m_hMutex , INFINITE);//第二个参数为INFINITE表示一直等待,直到拥有互斥对象
//功能执行
。。。
::ReleaseMutex(m_hMutex);//使用完毕,将互斥对象还给操作系统

说明:
在调用CreateMutex()创建互斥对象时:
若对象所有权为空,则主线程和子线程中分别等待互斥量,即主线程和子线程交替输出;
若标志位TRUE,则互斥对象所有权对创建的线程调用,其余线程无法调用此互斥对象。

此处引用网上的说法:
如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有。是FALSE,表示刚刚创建的这个Mutex不属于任何线程 也就是没有任何线程拥有他,一个Mutex在没有任何线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

结语

导致问题出现的根本原因尚未找到,只是在此处提出两个方案来解决此问题,若各位有其他的建议和看法,欢迎来评论区讨论。

【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误相关推荐

  1. JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案

    基本概念 Java通过系统类System实现标准输入/输出的功能 通过实例化Scanner类的方式实现从键盘的数据输入 问题描述 错误示例一: import java.util.Scanner;pub ...

  2. c 调用matlab文件路径,C/C++下调用matlab函数操作说明

    1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...

  3. 在Windows/Linux下调用API函数实现重启系统

    一.Linux下重启系统 linux下很简单,直接看代码: #include <unistd.h> #include <sys/reboot.h>bool rebootSyst ...

  4. Rstudio调用plot()函数时,出现错误的处理方法

    按照书上的例子敲出代码后,发现Rstudio无法识别C盘user文件夹下的中文用户名.如下图所示: 按照网上的做法,尝试修改计算机user下的用户名,没修改成功. 另一种做法是在plot()函数前面加 ...

  5. 关于 Windows 10 下安装 Linux 过程及报 'WSL...' 错误的解决办法

    今天下午在群里看到有朋友发有关"Windows 10 下按安装 Linux 系统"的消息,小白我很是激动啊(Linux 贴近工作,Windows 贴近生活,割舍不下-),虽然可以在 ...

  6. vue 外部方法调用内部_vue函数内部调用外部函数,报错外部函数不是函数

    zeroFill (num,len,radix) { let str = num.toString(radix || 10); while (str.length < len) { str = ...

  7. mysql405错误_mysql - 在框架内php调用某个方法, nginx 报 405错误 Status Code:405 Method Not Allowed...

    在框架内方法某个方法 nginx 报 405错误 Status Code:405 Method Not Allowed Remote Address:102.224.214.168:80 Reques ...

  8. fragment 中调用getactivity()的时候报 nullpoint错误

    好久没记录了,最近好一顿折腾,终于要结束了.今天发现了一个问题: 在fragment中用到getactivity()竟然报nullpoint错误.当时看了log吓着了,这也能报null,百度一通,原来 ...

  9. Matlab下调用Python接口

    MATLAB 到 C 语言程序的转换可以由两种途径完成,其一是 MATLAB 自己提供的 C 语言翻译程序 mcc, 另一种是原第 3 方公司 MathTools 开发的 MATCOM.后者出现较早, ...

最新文章

  1. 成为软件高手的几个忌讳
  2. SCOM2012部署系列之七:推送Windows监控代理
  3. hdu-2204(容斥原理)
  4. QQ第三方授权登录(带详细源码)
  5. 如何成为合格的企业邮箱管理员
  6. TRACE32-ICD的在线帮助ICD教程摘要
  7. 复制粘贴之后出现问号怎么办_复制粘贴文字变乱码解决
  8. 实验三 Python表达式
  9. echarts 基于个性化百度地图的迁徙图
  10. 哄女朋友必备之微信自动发红包脚本(python+adb+androidviewclient)
  11. 从人物的名字看香港电影人的文化底蕴
  12. linux底层把值传给上层,Android上层如何调用一个底层函数
  13. vue 移动端音乐(3) amp;amp;gt;热门歌单推荐部分(webpack-dev-conf.js做后端接口代理+scroll插件)
  14. Android 9.0 设置讯飞语音引擎为默认tts语音播报引擎
  15. iOS调用QQ客户端,发起临时会话
  16. 计算机学院运动会海报,运动会海报评比 | 第三十五届田径运动会,咱们燥起来...
  17. 基于微信小程序和安卓的婚恋相亲app
  18. Xcode模拟器上安装.app的方法
  19. xwiki 知识管理系统
  20. 广州大学 计算机学院学硕考研分数线,2020广州大学研究生分数线(以及历年复试)...

热门文章

  1. 古筝考级与教学(周望)
  2. Ambassador系列-11-Helm安装Ambassador Edge Stack 1.1.0
  3. 华为手机年轻化转型初见成效,《梦想的声音》传递了哪些讯号?
  4. 通过 POP3 协议下载电子邮件
  5. 左右脑分析php,左右脑测试(右脑十个测试图)
  6. H3C WA4320H-CAN刷FAT肥模式
  7. bert 句向量 的 各向异性问题 及与 对比学习 的联系
  8. XML在分布式异构数据厍数据整合中的应用
  9. 【玩转控件系列】控件布局之随心掌控布局 Align And Anchors
  10. 智慧工地云平台VR安全教育培训整体解决方案