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得程序可能出现问题!)
分享到:
相关推荐
但是,实际上,这两个函数的使用是非常危险的,容易导致程序的死锁和崩溃。 SuspendThread函数的主要用途是供调试器使用,而不是用于线程同步。MSDN文档明确指出,这个函数不是为线程同步而设计的。同样,...
- `TerminateThread` API 函数可以直接结束线程,但这种方法不推荐,因为它可能不会清理线程资源,甚至导致程序崩溃。 - 更安全的做法是通过设置 `FreeOnTerminate` 属性为 `True`,然后调用 `Terminate` 方法。...
当线程遇到异常时,如果不加以处理,可能导致整个应用程序崩溃。Win32 API提供了结构化异常处理(Structured Exception Handling,SEH)机制,允许程序员捕获和处理运行时错误,包括访问违规等硬件异常。此外,每个...
在"杀死工作线程"中,可能涉及到如何在工作线程中适当地捕获和处理异常,以防止异常扩散到其他线程或进程,造成系统崩溃。 在实际应用中,线程的管理还包括线程池的使用,线程池可以有效地减少创建和销毁线程的开销...
在单线程程序中,如果某个操作耗时较长,如上述例子中的`Sleep(6000)`,会导致程序在执行该操作期间无法响应其他用户输入,给人以“死机”的感觉。为了解决这个问题,引入了多线程技术,使得程序可以在后台执行耗时...
每个线程应有自己的异常处理机制,确保异常不会跨线程传播并导致程序崩溃。 六、线程局部存储 线程局部存储(Thread Local Storage, TLS)允许每个线程拥有独立的数据副本,避免了线程间的数据冲突。在VC++中,可以...
使用需谨慎,因为它可能不会正确清理线程资源,可能导致数据损坏或程序崩溃。 4. 同步和互斥机制:Windows提供了诸如`Mutex`、`Semaphore`和`Event`等同步对象,用于控制线程之间的访问和通信,防止竞态条件和死锁...
由于它不遵循正常的线程结束流程,因此可能导致程序崩溃或其他未定义的行为。 4. **终止线程所在的进程**: 这是最极端的方法,通常只在程序崩溃或异常情况下使用。当进程被终止时,操作系统会清理所有进程内的...
需要注意的是,挂起和恢复进程或线程时必须谨慎操作,错误的操作可能导致数据丢失、程序崩溃或其他不可预见的问题。此外,挂起系统进程或某些关键进程可能会影响系统的正常运行,因此应避免对不应挂起的进程进行操作...
4. `TerminateThread`函数用于强制终止指定线程,这通常是一种极端措施,因为线程可能没有机会清理其资源,可能导致数据损坏或程序崩溃。 在MFC中,多线程的支持更进一步抽象化,通过CWinThread类简化了线程的创建...
不当的线程管理可能导致资源泄露或程序崩溃。例如,未及时释放线程资源、错误的线程终止逻辑等都会对程序的健壮性产生负面影响。 总之,多线程编程是现代软件工程中不可或缺的一部分,尤其在高并发、高性能的场景下...
例程可能展示了如何正确地处理线程中的异常,防止程序崩溃。 7. **线程优先级**:通过设置线程的优先级,可以影响线程调度。`SetThreadPriority`函数可以用来改变线程的优先级,但过度使用可能导致优先级反转和饥饿...
同时,尽量避免使用`TerminateThread`,因为它可能导致资源泄漏。创建新线程时,推荐使用`_beginthreadex`而非`CreateThread`,因为前者提供更好的线程控制。 以上就是关于VC++调试的一些核心方法和技巧,通过熟练...
线程创建后,可以通过`SuspendThread`和`ResumeThread`函数暂停和恢复线程,使用`TerminateThread`函数强制结束线程(不推荐,可能导致资源泄露)。线程运行完毕后,系统会自动清理其资源,但最好在主线程中等待其他...
当线程运行完毕后,Windows会自动将其从内存中移除,但你也可以调用`TerminateThread()`强制结束线程,不过这种方法并不推荐,因为它可能会导致资源泄露。 总结来说,MFC线程提供了在Windows平台上构建多线程应用的...
线程中的异常处理同样重要,可以使用`try-except`结构捕获并处理异常,防止异常导致整个程序崩溃。 ### 八、线程池 线程池是一种优化策略,预先创建一组线程,当需要执行任务时,从池中获取空闲线程而不是每次创建...
但在单处理器环境中,操作系统通过时间片轮换来调度线程,可能因频繁切换导致性能下降,特别是在高竞争场景下。 #### 三、Win32 API对多线程的支持 Win32 SDK提供一系列API函数,覆盖线程的创建、控制和通信。以下...
不正确的线程终止方法可能会导致程序出现不可预知的行为、资源泄露甚至崩溃等问题。因此,了解如何安全地终止线程至关重要。 #### 安全终止线程的方法 本篇文章将详细介绍几种安全终止线程的方法及其背后的原理,...