2 wangxingdezh123 wangxingdezh123 于 2014.11.05 19:39 提问

临界区 使用sleep后程序崩溃

m_list1,m_list2,是映射的两个listbox的控件变量,在sleep后崩溃,刚开始以为时间设置小了,调整到1000,还是崩溃,敬请各位大牛指点小弟。。。。。。
代码如下:
int nTiecks =30;
HANDLE hthread1,hthread2;
CRITICAL_SECTION cs;

DWORD WINAPI Threadproc1(LPVOID p)
{
CThread2Dlg pDlg = (CThread2Dlg) p;
while(1)
{
EnterCriticalSection(&cs);

    if (nTiecks > 0)
    {

        CString str;
        str.Format("%d",nTiecks);
        pDlg->m_list1.AddString(str);
        nTiecks--;
        LeaveCriticalSection(&cs);
    }
    else
    {
        LeaveCriticalSection(&cs);
        break;
    }

}
return 0;

}
DWORD WINAPI Threadproc2(LPVOID p)
{
CThread2Dlg *pDlg = (CThread2Dlg *)p;
while(1)
{
EnterCriticalSection(&cs);

    if (nTiecks > 0)
    {
        CString str;
        str.Format("%d",nTiecks);
        pDlg->m_list2.AddString(str);
        nTiecks--;
        LeaveCriticalSection(&cs);
    }
    else
    {
        LeaveCriticalSection(&cs);
        break;
    }

}
return 0;

}
void CThread2Dlg::OnButton1()
{
// TODO: Add your control notification handler code here

nTiecks = 30;
m_list1.ResetContent();
m_list2.ResetContent(); 
    InitializeCriticalSection(&cs);

hthread1 = CreateThread(NULL,0,Threadproc1,this,0,NULL);
hthread2 = CreateThread(NULL,0,Threadproc2,this,0,NULL);
CloseHandle(hthread1);
CloseHandle(hthread2);

Sleep(1000);
::DeleteCriticalSection(&cs);

}

1个回答

zh852
zh852   2016.12.02 14:20

你跟踪下两个线程是否跑完了,别用sleep 用waitformultiobject,等两个线程退出了再deletecriticalsection

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
为啥spinlock里面不能sleep
1. splin_lock在linux下面的实现,会禁止内核抢占,     代码如下:           static inline void __spin_lock(spinlock_t *lock) {      preempt_disable();      spin_acquire(&lock->dep_map, 0, 0, _RET_IP_); } 2.  这里禁
多线程调试时Sleep位置异常崩溃
今天调试一个dll,这个dll里面创建了一个线程CWinThread:
多线程导致程序崩溃
在多个线程并发做同一任务时,程序直接崩溃,导致原因: 1、线程调用服务后未sleep,一直占用cpu,导致程序直接被杀死 2、临界区section为初始化,导致线程争用,程序崩溃
多线程编程-临界区实现
一、实现的技术如下:1、以对象管理资源(例如:临界区),即资源获得即初始化(RAII)。2、防止异常逃出析构函数,即必须捕捉析构函数产生的异常。3、恰好足够线程安全。二、以对象管理资源:1、不以对象管理资源分析:       以CCriticalSection类(见附录源码)为例分析如下:   (a)、该类可以实现临界区管理功能,具体功能如下:       、临界区
Linux内核小笔记:spin_lock锁内不能使用sleep休眠
有一个字符驱动,内部ioctl函数不同的分支均使用spin_lock和spin_unlock,以保证对外设操作的原子性。但是,有一个功能需要对一个GPIO引脚设置上下沿,于是就使用msplee来延时。结果应用层程序在多个线程中调用该驱动提供的ioctl接口时,发现系列卡死了,只能手动复位。原来不能在spin lock中使用sleep。
QT程序运行崩溃解决方法
FTH: (8092): *** Fault tolerant heap shim applied to current process. This is usually due to previous crashes. *** 今天执行QT程序时突然出现的错误,百度了一下说是之前的程序没关,导致运行崩溃。 解决方案 1. 重新构建项目清理一下程序,就可以运行了。 2. 在项目里面重新构建一
【多线程开发】临界区死锁问题
最近在学习网络多线程编程时遇到的一个问题,就是使用临界区时,由于使用不当而触发的死锁。 表象就是 应用程序安全卡死,内存和CPU消耗没有变化;实质是:控制共享资源的临界区没有进行正确的释放。 解决过程: 1.出现上述表象之后,就中断程序,VS截图如下: 2. 如果是VS,这时编译器就会弹出提示框 3. 点击确定后查看线程视图: 4.发现子线程都停留在IOCPMgr::Add
FreeRTOS 临界区总结
当一名嵌入式开发人员从裸机开发切换到 基于 FreeRTOS 的开发后就要注意 中断,资源竞争等等问题了。                    下面,总结一下 FreeRTOS 临界区的知识及用法:           1. 应该程序使用临界区           1.1 深入剖析的方法: taskENTER_CRITICAL() -> portENTER_CR
临界区使用方法实例
VC/MFC 临界区使用方法实例 转载▼ 转载自新浪博客     临界区的作用:避免临界区内的数据(一般为共享的资源)被不同的线程同时访问,实现线程的同步操作。保证只能由先进入临界区的一个线程访问结束后,其他线程才可以继续访问共享的资源。 以下为临界区的使用方法: *.h头文件: #include CRITICAL_SECTION  m_cs
windows下临界区的使用
临界区: 适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高。 相关结构:CRITICAL_SECTION_critical 相关方法: InitializeCriticalSection(& _critical)  /*初始化,最先调用的函数。没什么好说的,一般windows编程都有类似初始化的方法*