首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在线程终止之前调用CloseHandle()是否合理?

在线程终止之前调用CloseHandle()是合理的。

在Windows操作系统中,每个进程都有一个独立的内存管理单元,也就是一个独立的地址空间。线程是进程中的一个实体,拥有独立的地址空间、内存栈和线程本地存储。当线程终止时,操作系统会回收线程的内存资源,并将资源归还给进程的地址空间。

CloseHandle()是一个操作系统提供的API,用于关闭一个已打开的句柄。当一个线程打开了一个文件句柄或者其它类型的句柄时,可以使用CloseHandle()函数来关闭句柄,以释放资源。在线程终止之前,通过调用CloseHandle()来关闭句柄,可以确保资源被正确释放,避免资源泄漏的问题。

因此,在线程终止之前调用CloseHandle()是合理的,可以确保资源被正确释放。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

c++多线程重点难点(三)Mutex

,结束访问时就要调用ReleaseMutex()来表示自己已经结束访问,其它线程可以开始访问了。...销毁互斥量:CloseHandle 内核对象的销毁都可以用这个方法 要注意的是: 1.互斥量解决不了线程间的同步问题 2.互斥量和关键段一样拥有“线程拥有权” 3.遗弃特性: 比如有一个占用互斥量的线程调用...ReleaseMutex()触发互斥量前就意外终止了(相当于该互斥量被“遗弃”了),那么所有等待这个互斥量的线程是否会由于该互斥量无法被触发而一直阻塞?...这显然不合理。因为占用某个互斥量的线程既然终止了那足以证明它不再使用被该互斥量保护的资源,所以这些资源完全并且应当被其它线程来使用。...下面有两个程序用来实现mutex的遗弃特性,运用这两个程序时要先启动程序一再启动程序二,将程序一中//exit(0);前面的注释符号去掉,这样程序一触发互斥量之前就会因为执行exit(0);语句而且退出

37830
  • WinForm多线程修改控件时,提示创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

    action(); } } 使用 SetControlSafe(this.lbName, () => { this.lbName.Text = name; }); 方法二: 一般线程调用...,提示 “创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” ,并且如果没有捕获到,则可能导致程序崩溃,直接关闭。...百度之后,发现需要判断控件的IsHandleCreated和IsDisposed等属性,并且如果还有错误,可以再捕获InvalidOperationException异常,避免程序崩溃 但是项目中有太多需要修改...此时,最好是自己写一个类,专门负责处理多线程UI调用,代码如下 public static class ControlInvoker { public static void...= true; }); 跟之前的代码差别不大,可直接替换所有跨线程调用UI的代码。

    2.6K10

    windows 多任务与进程

    例如某个CPU有8个处理器,可以通过进程的亲缘性设置让该进程的线程某两个处理器上运行,这样就不会像之前那样8个CPU中的任意几个上运行。...windows上一般更倾向于优先考虑将线程安排在之前执行它的那个处理器上运行,因为之前的处理器的高速缓存中可能存有这个线程之前的执行环境,这样就提高的高速缓存的命中率,减少了从内存中取数据的次数能从一定程度上提高性能...其实真实的情况是主线程结束,进程结束这个限制是VC++上的,之前自定义入口的时候说过,main函数只是语法上的,并不是实际的入口,调用main之前调用mainCRTStartup,这个函数会负责调用...,因为主线程先结束的话,整个进程就结束了,线程还来不及输出,就被终止了。...进程的终止状态从STILL_ACTIVE变成进程的退出码,可以通过这个特性判断某个进程是否在运行,具体的方式是通过函数GetExitProcess获取进程的终止码,如果函数返回STILL_ACTIVE,

    1.2K40

    C++ 共享内存ShellCode跨进程传输

    lpName: 一个指向包含互斥体名称的空终止字符串的指针。如果为 NULL,则创建一个匿名的互斥体;否则,创建一个具有指定名称的互斥体。通过指定相同的名称,可以多个进程中共享互斥体。...成功调用 CreateMutex 会返回互斥体对象的句柄,失败则返回 NULL。使用完互斥体后,应该通过 CloseHandle 函数关闭句柄以释放资源。...lpName: 一个指向包含事件对象名称的空终止字符串的指针。如果为 NULL,则创建一个匿名的事件对象;否则,创建一个具有指定名称的事件对象。通过指定相同的名称,可以多个进程中共享事件对象。...成功调用 CreateEvent 会返回事件对象的句柄,失败则返回 NULL。使用完事件对象后,应该通过 CloseHandle 函数关闭句柄以释放资源。...线程或者多进程环境中,互斥体可以确保同一时刻只有一个线程或者进程能够访问被保护的共享资源。

    25910

    用WinSock封装自己的UDP类2

    但是调用 CreateThread() 之后,为什么要调用 CloseHandle() 呢? 这是意欲何为?...CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而ExitThread的功能是终止一个线程,它所接受的参数是一个线程的退出码。...通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址...ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作。...当你程序中,不需要再操作创建的线程时,就CloseHandle掉,即便是那个线程目前计数为1,等你调用 CloseHandle 后该计数降为 0 ,但已经创建的线程并没有被马上撤消,而是等线程函数执行完毕后才撤消

    60310

    Windows下多线程数据同步互斥的有关知识

    对于操作系统而言,并行程序设计中难免会遇到数据同步和共享的问题,本文针对这个问题,以windows系统为例回顾一下资源同步的相关问题。...返回句柄的windows API 调用实际上是在内核空间创建某个资源,句柄只是这个资源的索引。当应用程序使用完该资源后,就可调用CloseHandle()使内核释放相关的内核空间资源。...但是,如果线程终止,则_beginthread()调用返回的句柄将是无效的,或是被重用的,因此无法查询线程的状态,甚至无法肯定线程句柄是最初指向同一线程的句柄。 ? 加上getchar()的区别 ?...((float)number) + 1.0); i++) {     if(number % i == 0 ){ return 0;} } return 1; } 测试给定范围内数字是否为素数的算法,如果两个线程同时访问变量...使线程休眠然后再唤醒线程非常耗时,因为这涉及进入内核。所有临界区设计上都应保证耗时尽可能短。要谨记,很可能线程进入休眠时,原处于临界区的线程已经离开。因此,令等待线程休眠后再唤醒浪费了很多时间。

    77620

    关于c++杀线程函数TerminateThread强烈不建议使用

    如果调用了这个函数,请确保使用WaitForSingleObject来等待线程对象的结束。...我们可以通过句柄来操作线程,句柄生命周期是从CreateThread返回到你CloseHandle(),closehandle后便释放句柄(如果不closehandle句柄资源很快用光) 3.关闭一个句柄对象...4.句柄操作线程例子,如WaitForSingleObject(ThreadHandle,1000)为等待线程1s的操作,假设判断10s后为线程超时的情况,不必调用TerminateThread杀线程,...等其线程生命周期结束return即可 二、调用TerminateThread杀线程的致命问题: TerminateThread终止线程后,堆栈没有被回收(注意连栈都没有被回收) 整个进程分配和回收内存时...,占用同一把锁,如果一个线程使用该锁时被杀死(即临死前该线程new或delete操作中),则其他线程就无法再使用new或delete了,表现为hang住 发布者:全栈程序员栈长,转载请注明出处:https

    78430

    互斥量Mutex的简单应用

    第三个参数用来设置互斥量的名称,多个进程中的线程就是通过名称来确保它们访问的是同一个互斥量。 函数返回值: 成功返回一个表示互斥量的句柄,失败返回NULL。...但在贴代码之前先简要说明一下WaitForSingleObject函数,该函数用于检测hHandle事件的信号状态。...WaitForSingleObject 函数功能:用来检测hHandle事件的信号状态,某一线程调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态...函数返回值: WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程结束时没有释放核心对象(通过调用ReleaseMutex函数释放)会引发此返回值...getchar函数,这样有助于观察进程3等待使用互斥量状态 getchar(); ReleaseMutex(hMutex); CloseHandle(hMutex); return 0; }

    43010

    c++ CreateThread

    若不想返回线程ID,设置值为NULL。 4.补记 4.1 CreateThread是一种微软Windows API中提供了建立新的线程的函数,该函数线程的基础上创建一个新线程。...线程终止运行后,线程对象仍然系统中,必须通过CloseHandle函数来关闭该线程对象。...4.2 需要调用到CRT库时,不要用CreateThread 创建线程、并用CloseHandle来关闭这个线程,而应该用_beginthread来创建线程,_endthread来销毁线程。...因为没有对子线程为CRT库分配堆,会导致低内存错误而崩溃。 4.3 CreateThread 不会判断lpStartAddr是数据还是代码,甚至不会判断是否有足够的访问权限。...创建类成员函数的对象时,this指针是调用CreateThread时所处的类对象的指针。类对象外调用,其this指针将是未知的。

    39410

    windows 纤程

    它与线程本质上没有区别,它也有上下文环境,纤程的上下文环境也是一组寄存器和调用堆栈。它是比线程更小的调度单位。...纤程内存栈的最高和最低地址,当线程转换为纤程的时候,这也是线程的内存栈。之前说过纤程栈是在建立在线程的基础之上,保留这两个值是为了当纤程还原为线程后,用来还原线程栈环境 4....纤程的删除 当纤程结束时需要调用DeleteFiber来删除线程,类似于CloseHandle来结束对应的内核对象。...如果是调用转化函数由线程转化而来,调用DeleteFiber相当于调用ExitThread来终止线程,所以对于这种情况,最好是将纤程转化为线程,然后再设计一套合理线程退出机制。...纤程的调度 在任何一个纤程内部调用SwitchToFiber函数,将纤程的void*指针传入,即可切换到对应的纤程,该函数可以在任意几个纤程中进行切换,不管这些纤程是一个线程中或者不同的线程中。

    79620

    c语言createthread函数,C++中CreateThread函数创建线程的用法和实例

    CreateThread是一种微软Windows API中提供了建立新的线程的函数,该函数线程的基础上创建一个新线程。...线程终止运行后,线程对象仍然系统中,必须通过CloseHandle函数来关闭该线程对象。...需要调用到CRT库时,不要用CreateThread 创建线程、并用CloseHandle来关闭这个线程,而应该用_beginthread来创建线程,_endthread来销毁线程。...因为没有对子线程为CRT库分配堆,会导致低内存错误而崩溃。 CreateThread 不会判断lpStartAddr是数据还是代码,甚至不会判断是否有足够的访问权限。...创建类成员函数的对象时,this指针是调用CreateThread时所处的类对象的指针。类对象外调用,其this指针将是未知的。

    2.1K20

    干货|Windows下进程操作的一些C++代码

    TerminateProcess BOOL TerminateProcess( HANDLE hProcess, UINT uExitCode); 第一个参数为要结束进程的进程句柄,第二个参数为终止代码...not found"); return FALSE;} 0x05 dll注入 dll加载:1.静态调用:通过我们的程序中添加头文件,以及lib文件来完成调用,前提就是获取dll然后还有头文件...这里使用动态调用 流程大概就是 1.目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 首先打开进程获取到进程句柄 hProcess...; } CloseHandle(parentProcessHandle);} 首先我们要获取父进程的进程句柄然后为进程和线程创建初始化指定的属性列表使用InitializeProcThreadAttributeList...si.lpAttributeList堆中分配一块内存,分配的大小为前面的SizeBuff。

    1.4K30

    老版VC++线程

    下面来依次说明各种线程池的使用: 普通线程池 普通线程使用时主要是调用QueueUserWorkItem函数将回调函数加入线程池队列,线程池中一旦有空闲的线程就会调用这个回调,函数原型如下: BOOL...线程池的默认标志 WT_EXECUTEINIOTHREAD 以IO可警告状态运行线程回调函数 WT_EXECUTEINPERSISTENTTHREAD 该线程将一直运行而不会终止 WT_EXECUTELONGFUNCTION...执行一个运行时间较长的任务(这会使系统考虑是否线程池中创建新的线程) WT_TRANSFER_IMPERSONATION 以当前的访问字串运行线程调用回调函数 下面是一个具体的例子: void...调用DeleteTimerQueue删除这样一个线程池对象,删除这个线程池的时候它上面绑定的回调也会被删除,所以在编码时可以直接删除线程池对象而不用调用DeleteTimerQueueTimer删除每一个绑定的计时器对象...,它的第二个参数就表示它所等待的对象是否为有信号。

    1.5K30

    【操作系统】Windows进程间的通信

    地址空间 它包含所有可执行模块或DLL模块的代码和数据,另外,它也包含动态内存分配的地址空间,例如线程的栈和堆分配空间。 进程从来不执行任何东西,它只是纯粹的容器,或说是线程的执行环境。...若要使它完成某项操作,它必须拥有一个它环境中运行的的线程,次线程负责执行包含在进程的地址空间中的代码,也就是,真正完成代码执行的线程。...单任务的同步机制——线程、子进程都可以实现。 需要保护地址空间。 子进程的线程既可以父进程终止之后执行代码,也可以父进程运行的过程中执行代码。...如果//lpProcessAttributes为NULL,则不能继承该句柄 _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //该结构确定子进程是否可以继承返回到新线程对象的句柄...如果//lpThreadAttributes为NULL,则不能继承该句柄 _In_ BOOL bInheritHandles, //如果此参数为TRUE,则新进程将继承调用进程中的每个可继承句柄。

    87540
    领券