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

article/2025/10/29 3:35:06

【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在没有任何线程拥有他的时候,他是处于激发态的, 所以处于有信号状态。

结语

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


http://chatgpt.dhexx.cn/article/4V4IaEV8.shtml

相关文章

联合使用类CCriticalSection和类CSingleLock同步线程

(1)新建一个控制台工程SellTicketTest2,并在向导的“应用程序设置”中勾选“MFC”。 (2)打开SellTicketTest2.cpp,在开头中引入头文件。 #include "afxmt.h"(3)添加变量&…

单独使用CCriticalSection对象来同步线程

(1)新建一个控制台工程SellTicketTest,并在向导的“应用程序设置”中勾选“MFC”,因为CCriticalSection属于MFC类,如图所示。 (2)在SellTicketTest.cpp开头中引入头文件。 #include "afx…

linux查看java线程死锁_ccriticalsection 多线程 死锁_c++ 线程死锁_linux 线程 死锁

qq_407283393122018-12-10 一个很蠢的造成死锁的问题 wanglt3113172018-12-12 什么是死锁,死锁的原因,如何避免 apanying902019-01-09 c3p0连接死锁 Cain_1507662016-09-20 notify产生死锁的场景(备忘) liuchuanyangyan9132017-02-23 C3P0配置错误导致的…

MFC线程同步—— CCriticalSection类使用

多个线程访问临界区时,可以使用临界区对象。临界区对象是一个独占性共享资源,任一时刻只有一个线程可以拥有临界区。拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线…

CCriticalSection与CSingleLock

CCriticalSection An object of class CCriticalSection represents a “critical section” — a synchronization object that allows one thread at a time to access a resource or section of code. Critical sections are useful when only one thread at a time can be …

关键部分CCriticalSection使用

类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻仅仅同意一个线程存取资源或代码区。临界区在控制一次仅仅有一个线程改动数据或其他的控制资源时很实用。比如,在链表中添加一个结点就仅仅同意一次一个线程进行…

模拟售票大厅实例——多线程时访问共享变量时的安全(CMutex或CCriticalSection的应用)

当程序运行时,可以通过多线程来提高程序运行的效率和拥有更好的体验。但多线程(或多进程)同时也带来很多的问题:最严重的莫过于对同一个对象或变量访问时,由于线程运行异步的原因,会造成程序运行出现无法控…

在MFC下面实际演示CCriticalSection 的使用

Q:CCriticalSection是什么? A:CCriticalSection是一种线程同步策略 或者说技术 或者方法 总之呢就是这么个意思。。。。 参考资料: http://blog.csdn.net/akof1314/article/details/5773076 http://www.cnblogs.com/hlxs/archi…

Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)

个人推荐: 📢📢📢 前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下 "通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。点击跳转到教程。 一:AlterDialog对话框 二:普通对话框 运行效果…

Android对话框显示输入框

在弹出的对话框显示输入框有两种方法: 法一:新建一个布局,并在对话框中引用它。 法二:直接在Activity中定义Edit并在对话框中用getText方法得到输入信息。

Android对话框的使用

Android对话框的使用 对话框(Dialog)是Android系统在Activity或者其他组件运行过程中提供的一种提示机制。它可以帮助应用完成一些必要的提示功能,同时提供一些与用户交互的功能。 对话框分为很多种,下面将一一介绍…

android 自定义对话框

// 基础库 implementation com.github.goweii.AnyLayer:anylayer:2.5.0 // 通用弹窗&#xff08;依赖基础库&#xff09; implementation com.github.goweii.AnyLayer:anylayer-common:2.5.0 编写dialog_layout 布局 <?xml version"1.0" encoding"utf-8&qu…

Android对话框的使用总结

一&#xff0e;相关概念 一个对话框一般是一个出现在当前Activity之上的一个小窗口. 处于下面的Activity失去焦点, 对话框接受所有的用户交互. 对话框一般用于提示信息和与当前应用程序直接相关的小功能. Android API 支持下列类型的对话框对象: &#xff08;一&#x…

Android对话框控件读写,Android 对话框控件

对话框控件 一、概述 对话框是 UI 设计中常用的控件&#xff0c;在windows操作系统中&#xff0c;对话框可分为模式对话框和非模式对话框。 模式对话框在使用时&#xff0c;项目中其它UI是不允许操作的&#xff0c;如保存对文件话框 非模式对话框允许操作其它的 UI Android 的对…

Android对话框总结

一、什么是对话框&#xff1f; 一种次要窗口&#xff0c;包含按钮和各种选项&#xff0c;通过它们可以完成特定命令或任务。 查找和替换对话框 对话框与窗口有区别&#xff0c;它没有最大化按钮、没有最小化按钮、大都不能改变形状大小。&#xff08;“打开文件”对话框是可以改…

Android常用对话框

学习目标&#xff1a; 两周入门Android 学习内容&#xff1a; 常见对话框: 对话框是程序与用户交互的一种方式&#xff0c;通常用于显示当前程序提示信息以及相关说明,以小窗口形式展现 普通对话框&#xff1a; 通过AlertDialog.Builder(this).create来创建对话框最后通过…

了解Android布局,了解Android对话框布局

我正在为我的android应用程序做一个简单的自定义对话框&#xff0c;只显示一个搜索栏。然而&#xff0c;这个简单任务的复杂性让我很烦。了解Android对话框布局 我的对话框布局如下&#xff1a;在代码中创建 android:orientation"vertical" android:layout_width&quo…

Android对话框(普通对话框、单选对话框、多选对话框、进度条对话框)

一、普通对话框 // 通过builder 构建器来构造AlertDialog.Builder builder = new Builder(this);builder.setTitle("警告");builder.setMessage("你好么 ");builder.setPositiveButton("好", new OnClickListener() {@Overridepublic void onCl…

android 对话框窗口,Android 对话框详解(一)

对话框是程序运行中的弹出窗口。例如&#xff0c;当用户要删除一个联系方式时&#xff0c;会弹出一个 对话框&#xff0c;让用户确认是否真的要删除。 Android系统提供了四种对话框:警告对话框 (AlertDialog)、进度对话框(ProgressDialog)、日期选择对话框(DatePickerDialog)和…

Android对话框

(不足之处,多多担待) 一: 对话框的种类 1:提示对话框 2:自定义对话框 3:弹出对话框 二:设置对话框的详细步骤 1:提示对话框 在activity中设置代码实现功能 , 第一步实例化对话框 第二步是设置对话框的提示内容 ,有4个主要方法 (窗贴提示内容:setTitle() / setMessage()…