`
shfzhzhr
  • 浏览: 70756 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TerminateThread可能导致程序崩溃

阅读更多

DWORD __stdcall mythread(void* )
{
    while( true )
    {
        char* p = new char[1024];

        delete p;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{

    HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL);

    Sleep(1000);

    TerminateThread(h, 0);
    h = NULL;

    char* p = new char[1024]; //这里会死锁,过不去

    delete p;

    return 0;
}

    为什么死锁呢?new操作符用的是小块堆,整个进程在分配和回收内存时,都要用同一把锁。如果一个线程在占用该锁时被杀死(即临死前该线程在new或delete操作中),其他线程就无法再使用new或delete了,表现为hang住。

    《核心编程》里明确提醒不要TerminateThread,但原因并不是血淋淋滴。今天发现的这个bug印证了此书的价值。

    另注:许多临时的网络操作经常用TerminateThread,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。

 

    可能引发的问题包括: 1 If the target thread owns a critical section, the critical section will not be released. (未释放互斥区,造成死锁) 2 If the target thread is allocating memory from the heap, the heap lock will not be released. (未释放堆分配锁,造成死锁) 3 If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread's process could be inconsistent. (在执行内核函数时退出,造成该线程所在进程状态不确定,程序可能崩溃) 4 If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL. (在使用DLL时退出,造成DLL被销毁,其他使用该DLL得程序可能出现问题!)

分享到:
评论

相关推荐

    不能调用Suspend/TerminateThread的原因

    但是,实际上,这两个函数的使用是非常危险的,容易导致程序的死锁和崩溃。 SuspendThread函数的主要用途是供调试器使用,而不是用于线程同步。MSDN文档明确指出,这个函数不是为线程同步而设计的。同样,...

    delphi 多线程的操作

    - `TerminateThread` API 函数可以直接结束线程,但这种方法不推荐,因为它可能不会清理线程资源,甚至导致程序崩溃。 - 更安全的做法是通过设置 `FreeOnTerminate` 属性为 `True`,然后调用 `Terminate` 方法。...

    Win32多线程程序设计.pdf(带目录)

    当线程遇到异常时,如果不加以处理,可能导致整个应用程序崩溃。Win32 API提供了结构化异常处理(Structured Exception Handling,SEH)机制,允许程序员捕获和处理运行时错误,包括访问违规等硬件异常。此外,每个...

    杀死工作线程.rar

    在"杀死工作线程"中,可能涉及到如何在工作线程中适当地捕获和处理异常,以防止异常扩散到其他线程或进程,造成系统崩溃。 在实际应用中,线程的管理还包括线程池的使用,线程池可以有效地减少创建和销毁线程的开销...

    VC++多线程编程

    在单线程程序中,如果某个操作耗时较长,如上述例子中的`Sleep(6000)`,会导致程序在执行该操作期间无法响应其他用户输入,给人以“死机”的感觉。为了解决这个问题,引入了多线程技术,使得程序可以在后台执行耗时...

    vc++多线程示例

    每个线程应有自己的异常处理机制,确保异常不会跨线程传播并导致程序崩溃。 六、线程局部存储 线程局部存储(Thread Local Storage, TLS)允许每个线程拥有独立的数据副本,避免了线程间的数据冲突。在VC++中,可以...

    多线程编程基础.pdf

    使用需谨慎,因为它可能不会正确清理线程资源,可能导致数据损坏或程序崩溃。 4. 同步和互斥机制:Windows提供了诸如`Mutex`、`Semaphore`和`Event`等同步对象,用于控制线程之间的访问和通信,防止竞态条件和死锁...

    C/C++中退出线程的四种解决方法

    由于它不遵循正常的线程结束流程,因此可能导致程序崩溃或其他未定义的行为。 4. **终止线程所在的进程**: 这是最极端的方法,通常只在程序崩溃或异常情况下使用。当进程被终止时,操作系统会清理所有进程内的...

    易语言挂起进程

    需要注意的是,挂起和恢复进程或线程时必须谨慎操作,错误的操作可能导致数据丢失、程序崩溃或其他不可预见的问题。此外,挂起系统进程或某些关键进程可能会影响系统的正常运行,因此应避免对不应挂起的进程进行操作...

    MFC多线程编程10例

    4. `TerminateThread`函数用于强制终止指定线程,这通常是一种极端措施,因为线程可能没有机会清理其资源,可能导致数据损坏或程序崩溃。 在MFC中,多线程的支持更进一步抽象化,通过CWinThread类简化了线程的创建...

    VC多线程深入详解

    不当的线程管理可能导致资源泄露或程序崩溃。例如,未及时释放线程资源、错误的线程终止逻辑等都会对程序的健壮性产生负面影响。 总之,多线程编程是现代软件工程中不可或缺的一部分,尤其在高并发、高性能的场景下...

    vc多线程学习的例程,大家一起分享吧

    例程可能展示了如何正确地处理线程中的异常,防止程序崩溃。 7. **线程优先级**:通过设置线程的优先级,可以影响线程调度。`SetThreadPriority`函数可以用来改变线程的优先级,但过度使用可能导致优先级反转和饥饿...

    vc++调试方法和技巧

    同时,尽量避免使用`TerminateThread`,因为它可能导致资源泄漏。创建新线程时,推荐使用`_beginthreadex`而非`CreateThread`,因为前者提供更好的线程控制。 以上就是关于VC++调试的一些核心方法和技巧,通过熟练...

    vc多线程编程简单介绍vc多线程编程简单介绍vc多线程编程简单介绍

    线程创建后,可以通过`SuspendThread`和`ResumeThread`函数暂停和恢复线程,使用`TerminateThread`函数强制结束线程(不推荐,可能导致资源泄露)。线程运行完毕后,系统会自动清理其资源,但最好在主线程中等待其他...

    MFC_thread.rar_MFC线程_Vc_mfc thread_mfc thread open file

    当线程运行完毕后,Windows会自动将其从内存中移除,但你也可以调用`TerminateThread()`强制结束线程,不过这种方法并不推荐,因为它可能会导致资源泄露。 总结来说,MFC线程提供了在Windows平台上构建多线程应用的...

    c++ builder 多线程

    线程中的异常处理同样重要,可以使用`try-except`结构捕获并处理异常,防止异常导致整个程序崩溃。 ### 八、线程池 线程池是一种优化策略,预先创建一组线程,当需要执行任务时,从池中获取空闲线程而不是每次创建...

    VC中多线程使用.doc

    但在单处理器环境中,操作系统通过时间片轮换来调度线程,可能因频繁切换导致性能下降,特别是在高竞争场景下。 #### 三、Win32 API对多线程的支持 Win32 SDK提供一系列API函数,覆盖线程的创建、控制和通信。以下...

    如何安全终止线程

    不正确的线程终止方法可能会导致程序出现不可预知的行为、资源泄露甚至崩溃等问题。因此,了解如何安全地终止线程至关重要。 #### 安全终止线程的方法 本篇文章将详细介绍几种安全终止线程的方法及其背后的原理,...

Global site tag (gtag.js) - Google Analytics