【MFC】CCriticalSection类在Release编译下调用Lock函数会报0xC0000008错误
【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错误相关推荐
- JAVA——Scanner类绑定System.in后调用close()方法所引发的错误及其解决方案
基本概念 Java通过系统类System实现标准输入/输出的功能 通过实例化Scanner类的方式实现从键盘的数据输入 问题描述 错误示例一: import java.util.Scanner;pub ...
- c 调用matlab文件路径,C/C++下调用matlab函数操作说明
1.matlab的安装 连接:http://pan.baidu.com/s/1qXuF7aO 安装32位版本的matlab(在目录下bin文件夹中有两个文件夹,选择win32文件夹下的setup进行安 ...
- 在Windows/Linux下调用API函数实现重启系统
一.Linux下重启系统 linux下很简单,直接看代码: #include <unistd.h> #include <sys/reboot.h>bool rebootSyst ...
- Rstudio调用plot()函数时,出现错误的处理方法
按照书上的例子敲出代码后,发现Rstudio无法识别C盘user文件夹下的中文用户名.如下图所示: 按照网上的做法,尝试修改计算机user下的用户名,没修改成功. 另一种做法是在plot()函数前面加 ...
- 关于 Windows 10 下安装 Linux 过程及报 'WSL...' 错误的解决办法
今天下午在群里看到有朋友发有关"Windows 10 下按安装 Linux 系统"的消息,小白我很是激动啊(Linux 贴近工作,Windows 贴近生活,割舍不下-),虽然可以在 ...
- vue 外部方法调用内部_vue函数内部调用外部函数,报错外部函数不是函数
zeroFill (num,len,radix) { let str = num.toString(radix || 10); while (str.length < len) { str = ...
- 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 ...
- fragment 中调用getactivity()的时候报 nullpoint错误
好久没记录了,最近好一顿折腾,终于要结束了.今天发现了一个问题: 在fragment中用到getactivity()竟然报nullpoint错误.当时看了log吓着了,这也能报null,百度一通,原来 ...
- Matlab下调用Python接口
MATLAB 到 C 语言程序的转换可以由两种途径完成,其一是 MATLAB 自己提供的 C 语言翻译程序 mcc, 另一种是原第 3 方公司 MathTools 开发的 MATCOM.后者出现较早, ...
最新文章
- 成为软件高手的几个忌讳
- SCOM2012部署系列之七:推送Windows监控代理
- hdu-2204(容斥原理)
- QQ第三方授权登录(带详细源码)
- 如何成为合格的企业邮箱管理员
- TRACE32-ICD的在线帮助ICD教程摘要
- 复制粘贴之后出现问号怎么办_复制粘贴文字变乱码解决
- 实验三 Python表达式
- echarts 基于个性化百度地图的迁徙图
- 哄女朋友必备之微信自动发红包脚本(python+adb+androidviewclient)
- 从人物的名字看香港电影人的文化底蕴
- linux底层把值传给上层,Android上层如何调用一个底层函数
- vue 移动端音乐(3) amp;amp;gt;热门歌单推荐部分(webpack-dev-conf.js做后端接口代理+scroll插件)
- Android 9.0 设置讯飞语音引擎为默认tts语音播报引擎
- iOS调用QQ客户端,发起临时会话
- 计算机学院运动会海报,运动会海报评比 | 第三十五届田径运动会,咱们燥起来...
- 基于微信小程序和安卓的婚恋相亲app
- Xcode模拟器上安装.app的方法
- xwiki 知识管理系统
- 广州大学 计算机学院学硕考研分数线,2020广州大学研究生分数线(以及历年复试)...