C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁

问题描述

C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁
C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁

 // 在主界面中显示提示信息void CIOCPModel::_ShowMessage(const int columnconst CString szFormat...){    // 根据传入的参数格式化字符串    CString   strMessage;    va_list   arglist;    // 处理变长参数    va_start(arglist szFormat);    strMessage.FormatV(szFormatarglist);    va_end(arglist);    EnterCriticalSection(&m_csTest);    // 在主界面中显示    CAA_5Axis_SingleDlg* pMain = (CAA_5Axis_SingleDlg*)m_pMain;    if( m_pMain!=NULL )    {        //pMain->ShowMsg(strMessage);        pMain->AddInformation(strMessagecolumn);        TRACE( strMessage+_T(""n"") );    }       LeaveCriticalSection(&m_csTest);}

上面的函数,在主线程和由主线程启动的多个子线程中都会被调用,单步跟踪的时候跟着跟着就死锁卡死了,百思不得其解,我有退出临界区啊,为啥还会死锁呢?
求大神解答···
PS:AddInformation(strMessagecolumn);是在主界面的ListControl中插入一项数据而已;

解决方案

更新界面的操作应该发消息让主线程自己去做。因为它们都是线程不安全的。

解决方案二:
CRITICAL_SECTION变量初始化了没

解决方案三:
进入临界区以后,你直接操作UI,可能AddInformation在操作界面的时候,mfc实现会有一些同步阻塞操作。这样可能会导致死锁。你应该用你更新界面没必要加锁。直接用PostMessage到主线程来更新界面。这是一个异步消息队列。这样主线程来一个个抽取消息更新界面

时间: 2024-11-18 12:18:27

C++中多线程使用临界区域进行互斥,造成死锁,百思不得其解求指点为啥会死锁的相关文章

类-MFC多线程同步问题,互斥量

问题描述 MFC多线程同步问题,互斥量 共享资源是一些类对象的MAP,每个对象(某设备实例)中有不同的互斥量同步不同的类变量(本意是防止多线程访问同一个对象),现在迷糊了,互斥量放在类里面是不是不当?是不是在访问对象的时候就加互斥量来的方便(对整个对象进行加锁 - 因为对整个类操作较多,这么做貌似锁太深了)?求大神帮助 解决方案 这个要具体看对象的生存空间,和互斥量的作用!无法一概而论. 解决方案二: 搞这么麻烦干什么,线程同步直接用CreateMutex和WaitForSingleObject

多线程 java 同步 锁-java中多线程访问同步问题

问题描述 java中多线程访问同步问题 public class SyschronizedSample{ private int value; public synchronized int get(){ return value;} public synchronized void set(int value) { this.value=value; } } 以上的代码中,要使得访问value时具有线程安全,所以在set和get方法中都加了synchronized同步语句,如果只在set方法前

Java多线程编程中使用Condition类操作锁的方法详解_java

Condition的作用是对锁进行更精确的控制.Condition中的await()方法相当于Object的wait()方法,Condition中的signal()方法相当于Object的notify()方法,Condition中的signalAll()相当于Object的notifyAll()方法.不同的是,Object中的wait(),notify(),notifyAll()方法是和"同步锁"(synchronized关键字)捆绑使用的:而Condition是需要与"互斥

Eclipse客户端程序中多线程的使用

简介:本文分析了Eclipse中多线程程序的实现,讨论了在Eclipse客户端程序开发中应用多线程的方 法和要注意的问题,同时也讨论了多线程程序的一些调试和问题解决的方法. Eclipse作为一个开发平台,使用越来越广泛,基于Eclipse Rich Client Platform开发的客户端程序 也越来越多.在当今越来越复杂的应用环境中,我们的客户端程序不可避免的要同时进行多任务的处理. 一个优异的客户端程序都会允许用户同时启动多个任务,从而大大提高用户的工作效率以及用户体验.本 文中我们来谈

浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础 下

在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI 线程上操作控件,否则很容易产生人品问题.可以想到,上次介绍的两个Timer基于ThreadPool,回调方 法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行 Invoke或BeginInvoke.其实,还有 第三种System.Windows.Forms.Timer,它可以让回调事件在UI线程上执行,我们来做一个实验比较一下 System.Windows.Forms.T

浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础 上

首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下 : Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间.

Python中多线程及程序锁浅析_python

Python中多线程使用到Threading模块.Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码: 复制代码 代码如下: # coding : uft-8 __author__ = 'Phtih0n' import threading class MyThread(threading.Thread):     def __init__(self):         threading.Thread.__init__(self)     def run(sel

锁-JAVA中多线程读取成员变量的重复问题

问题描述 JAVA中多线程读取成员变量的重复问题 这是个模拟卖票的问题,使用一个对象实现Runnable接口建立四个线程,这个对象有100张票,四个进程同时卖,因为没使用锁,所以会出现负数票,但是为什么会出现相同的票呢?8号票卖了四次,是因为成员变量在if之后进栈保存了值?然后直接用这个num输出吗? 代码: class Ticket implements Runnable//extends Thread { private int num = 100 public void run()//这时

java-Java中多线程同步锁报无效指针异常是何原因,求大神解答!

问题描述 Java中多线程同步锁报无效指针异常是何原因,求大神解答! /* 需求: 使用lock接口实现商品的生产和销售的动态平衡 思路: 1.创建被共同操作的数据类Resource,并通过多态引用分别创建lock和condition子类对象以及资源的获取和赋值方法 2.创建两个相反操作即生产和销售的类同时实现Runnable接口,并覆盖run方法 3.在主函数中,创建资源对象,并作为共同参数分别传递给生产和销售两个线程实现类的构造函数 4.分别将生产和销售类的对象作为参数,传给两个线程,并各自