【Win32多线程】如何初始化一个新线程,停止一个执行中的线程,调整线程优先权?

Win32线程——在某个线程内终止另一个正在运行的线程(1) 《Win32多线程程序设计》–Jim Beveridge & Robert Wiener 对于多线程程序,如果用户企图结束程序(主线程)时,子线程尚未完成工作,怎么办? 结束一个线程,听起来好容易,但是结束程序必须按次序进行,以避免发生 race conditions。让程序依次序进行是非常重要的,特别是在程序要结束之前。结束一个程序就好像拆除一栋建筑物一样,在你以推土机轧平它之前,你 阅读详情
如何在某个线程内终止另一个正在运行的线程?

--------干净地终止一个线程
利用TerminateThread()安全的关闭执行中的一个线程
BOOL TerminateThread(
  HANDLE hThread,    // handle to thread
  DWORD dwExitCode   // exit code线程的结束代码
);

该函数会引来许多问题,如果内存泄露。尽量不使用TerminateThread()
下面利用event对象来干净的结束一个线程
/*
 * 
 * Demonstrates how to request threads to exit.
 * 结束线程
 * 
 */


#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>




DWORD WINAPI ThreadFunc(LPVOID);


HANDLE hRequestExitEvent = FALSE;


int main()
{
    HANDLE hThreads[2];
    DWORD dwThreadId;
    DWORD dwExitCode = 0;
    int i;


    hRequestExitEvent = CreateEvent(
        NULL, TRUE, FALSE, NULL);
	//创建event对象,一开始处于未激发状态,靠程序来设置激发


    for (i=0; i<2; i++)
       hThreads[i] = CreateThread(NULL,
            0,
            ThreadFunc,
            (LPVOID)i,
            0,
            &dwThreadId);
       


    // Wait around for awhile, make
    // sure the thread is running.
    Sleep(1000);//保证线程可以运行


    SetEvent(hRequestExitEvent);//设置event激发状态通知线程退出
    WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);//主线程退出之前,确保其他线程已经安全退出


    for (i=0; i<2; i++)
        CloseHandle(hThreads[i]);


    return EXIT_SUCCESS;
}


DWORD WINAPI ThreadFunc(LPVOID p)
{
    int i;
    int inside = 0;


    UNREFERENCED_PARAMETER(p);


    /* Seed the random-number generator */
    srand( (unsigned)time( NULL ) );


    for (i=0; i<1000000; i++)
    {
        double x = (double)(rand())/RAND_MAX;
        double y = (double)(rand())/RAND_MAX;
        if ( (x*x + y*y) <= 1.0 )
            inside++;
        if (WaitForSingleObject(hRequestExitEvent, 0) != WAIT_TIMEOUT) //等待event对象的激发状态
        {
            printf("Received request to terminate\n");  //当收到event激发,则退出
            return (DWORD)-1;
        }
    }
    printf("PI = %.4g\n", (double)inside / i * 4);
    return 0;
}

-----线程优先权(Thread Priority)

优先权类别:它是进程的属性之一。这个属性可以表现出这一个进程和其他进程比较之下的重要性。Win32提供4种优先权类别。每一个类别对应一个基本的优先权层级。
优先权类别                                  基础优先权值
HIGH_PRIORITY_CLASS                            13
IDLE_PRIORITY_CLASS                             4
NORMAL_PRIORITY_CLASS                           7or8(大部分程序使用的)
REALTIME_PRIORITY_CLASS                          24
优先权类别适用于进程而非线程。可以利用SetPriortiyClass()和GetPriorityClass()来调整和验证其值。


优先权层级:线程的优先权层级是对进程的优先权类别的一个修改,使得你能够调整同一个进程内的各个线程的相对重要性。一共有七种优先权层级。

优先级层级                                                         调整值
 HTREAD_PRIORITY_HIGHEST                      +2
HTREAD_PRIORITY_ABOVE_NORMAL          +1
HTREAD_PRIORITY_NORMAL                        0
HTREAD_PRIORITY_BELOW_NORMAL          -1
HTREAD_PRIORITY_LOWEST                        -2
HTREAD_PRIORITY_IDLE                                 set to 1
HTREAD_PRIORITY_TIME_CRITICAL                set to 15


优先权层级利用SetThreadPriority()改变。
BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority   // thread priority level
);

获取目前线程的优先权GetThreadPriority()
int GetThreadPriority(
  HANDLE hThread   // handle to thread
);

创建一个线程,但是不要马上执行:

HANDLE hThread;
DWORD threadId;
hThread=CreateThread(NULL,0,THreadFunc,0,CREATE_SUSPENDED,&threadId);
一旦线程设定妥当,可以调用ResumeThread()开始执行。
DWORD ResumeThread(
  HANDLE hThread   // handle to thread
);

---挂起一个线程

SuspendThread()允许调用端指定一个线程睡眠。直到又有人调用了ResumeThread(),这个线程才会醒来。
DWORD SuspendThread(
  HANDLE hThread   // handle to thread
);
SuspendThread()的最大用途就是用来协调撰写调试器。调试器允许在程序的控制下,启动或停止任何一个线程。
Win32线程详解 线程的创建函数: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//线程结构体地址 用来继承 SIZE_T dwStackSize, //线程堆栈大小 LPTHREAD_START_ROUTINE lpStartAddress, //线程起始地址 线程 函数名 LPVOID lpParameter, ... 阅读详情

相关推荐

Win32线程——等待另一个线程结束

《Win32多线程程序设计》–Jim Beveridge & Robert Wiener “等待某个什么东西”是线程常常需要做的事。等待是线程的“必要之恶”。 如果你没有等待线程结束就莽撞地结束程序,线程会被系统强制结束掉——在它完成它的工作之前。 由于让线程停工是操作系统的责任,很合理地我们会认为操作系统也有责任让其他线程知道某个线程停工了。 Sleep()这个函数要求操作系统中止

SangYang 5618

Win32多线程程序设计学习(第五章)

不要让线程成为脱缰野马 这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如 何了解并调整线程优先权。 1,干净地终止一个线程 1)利用 TerminateThread() 放弃一个线程 BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ); ---------------------------------------------------------------- 参数 ------------------

asiwxy的博客 308

《Win32多线程程序设计》之线程终止

本文讨论如何在某个线程内终止另一个正在运行的线程或者在一个线程中控制其他线程类似问题方法一:利用 TerminateThread() 放弃一个线程 “TerminateThread() 是一个危险的函数, 应该在最不得已的情况下才使用”。 缺点: - 目标线程结束前无法释放堆栈,可能造成内存泄漏 - 如果线程在一个critical section中,则该critical se

qingmoshu的专栏 623

初始化线程的4种方式

初始化线程的4种方式 一、继承Thread接口 /** * 继承Thread接口 */ public static class Thread01 extends Thread{ @Override public void run() { System.out.println("当前线程" + Thread.currentThread().getId()); // 当前线程11 int i =

weixin_45716265的博客 1135

使用Win32 API创建、销毁线程——控制进度条

使用Win32 API创建、销毁线程——控制进度条

Blazor Session设置

微软官方封装了一些浏览器的操作,其中就有Session的操作的封装ProtectedSessionStorage 微软文档因为我们知道,依赖注入的生命周期是Singleton程序Scoped网页:刷新,url直接跳转都会重置。Transient路由C# Blazor 学习笔记(10):依赖注入但是没有一个和浏览器绑定的生命周期。即浏览器关闭才会退出。这个是后端无法获取的,因为后端根本不知道浏览器何时关闭。这个只能用浏览器自带的缓存。

qq_44695769的博客 1786

Win 32 多线程程序设计学习笔记之五:终止线程

如何在某个线程内终止另一个正在运行的线程? 1.利用TerminateThread() 放弃一个线程 BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode ); 参数 hThread 欲令其结束之线程的 handle。该线程就是我们的行动目标。 dwExitCode 该线程的结束代码。 返回值 如果函数成功,则传回

1127

ESP32-S3射频测试与全球认证全栈实践指南

功率谱密度(PSD)和发射功率等级是无线通信设备射频合规的核心基础概念,其物理层原理直接决定自适应测试、阻塞容限及多国认证的通过路径。PSD ≥10 dBm/MHz触发强制性自适应测试,需验证LBT机制与跳频鲁棒性;而16级可编程发射功率等级(-24 dBm至+20 dBm)则为功耗、覆盖与法规平衡提供工程调控维度。该能力广泛应用于低功耗蓝牙IoT终端、智能家居网关及工业无线传感器等场景,尤其在ESP32-S3平台中,需结合eFuse校准、Sigma工具链与QuickTrack认证策略实现从实验室调试到量产

weixin_34945060的博客 285

Win32多线程 -- 线程控制(暂停/继续/终止)

1. 关闭/终止 线程 BOOL TerminateThread( HANDLE hThread, DWORD dwExitCode // 该线程的结束代码, GetExitCodeThread获取的值 ); 如果函数成功, 则传回TRUE. 如果失败, 则传回FALSE. GetLastError()可以获知更多细节. 2.暂停/挂起 线程 DWORD SuspendThread( HANDLE hThread ); 如果函数成功, 传回线程目前的挂起次数. 如果失败...

cfz751740465的博客 1848

深入浅出ASAP2标准:手把手教你编写和解析A2L文件(含Python示例代码)

本文深入解析ASAP2标准下的A2L文件,涵盖基础概念、文件结构及Python实现代码,帮助开发者掌握汽车ECU标定和测量中的关键数据管理技术。通过详细示例,展示如何编写和解析A2L文件,提升电控数据管理效率。

happy2的博客 1099

机械臂的运动学分析-工业机器人

机械臂的运动学是研究机械臂各连杆坐标系之间的运动关系,是对机械臂进行运动控制的基础。本章分析了所设计的六自由度机械臂的运动学。理论上六自由度机械臂的工作空间是一个近似球形区域,能够覆盖机械臂所在的位置,但由于机械臂关节的运动范围受到限制,机械臂末端会存在一些不能到达的工作死区,使得机械臂的工作范围和灵活性受到限制。理论上六自由度机械臂的工作空间是一个近似球形区域,能够覆盖机械臂所在的位置,但由于机械臂关节的运动范围受到限制,机械臂末端会存在一些不能到达的工作死区,使得机械臂的工作范围和灵活性受到限制。

qq_59137727的博客 6647

第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---简介

这一章描述如何初始化一个新线程,如何停止一个执行中的线程,以及如何了解并调整线程优先权。 读过这一章之后,你将有能力回答一个 Win32 多线程程序设计的最基本问题。你一定曾经在 Usenet 的 Win32 论坛中一再地看过这个问题。当我开始在 Win32 上使用线程时,这个问题就一直在折磨我。我花了数天甚至数周的时间来寻找答案,并且希望找到的是一个好答案。 这个问题是: ...

weixin_30389003的博客 118

从零开始:kohya_ss环境部署与LoRA/SDXL模型训练实战指南

本文提供了一份详细的kohya_ss环境部署与模型训练实战指南。从零开始,手把手教你使用Conda创建虚拟环境、安装依赖并启动Web GUI界面。核心内容涵盖高质量数据集的准备方法,并重点解析了如何使用kohya_ss工具进行LoRA模型和SDXL模型的微调训练,包括关键参数配置与常见报错解决方案,帮助初学者快速上手AI绘画模型定制。

weixin_29162439的博客 534

Win32中线程的创建和关闭

1、win32中线程的创建   在win32中创建线程API函数 1 HANDLE CreateThread( 2 LPSECURITY_ATTRIBUTES lpsa, 3 DWORD cbStack, 4 LPTHREAD_START_ROUTINE lpStartAddr, 5 LPVOID lpvThreadParam, 6 DWORD fdw...

weixin_34233679的博客 416

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

nnpersistent的博客 5057

STM32实战开发(128):智能位移检测 - 使用STM32实现位移检测

STM32作为一款功能强大的微控制器,由于其出色的处理能力、丰富的外设接口和低功耗特点,成为实现智能位移检测系统的理想选择。未来,可以通过结合更多传感器、多种数据处理算法以及云平台技术,进一步提升系统的智能化水平,优化位移测量的精度和稳定性。本篇博客将介绍如何使用STM32微控制器实现智能位移检测系统,涉及硬件设计、传感器选择、软件开发等多个方面,提供详细的设计步骤,并给出完整的代码示例,帮助开发者快速搭建智能位移检测系统。蜂鸣器连接到STM32的GPIO端口,当位移超过设定的阈值时,蜂鸣器发出警报。

2201_76125393的博客 900

CreateThread、_beginthreadex和AfxBeginThread

瑶瑶按:创建线程好几个函数可以使用,可是它们有什么区别,适用于什么情况呢?参考了一些资料,写得都挺好的,这里做一些摘抄和整合。【参考1】CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别 =====================================================================

ljx0305的专栏 4446

RK3568平台YOLOv11模型部署全流程实战:环境搭建、模型转换与性能优化解析

在AI边缘计算领域,瑞芯微RK3568芯片凭借其强大的NPU算力和丰富的接口资源,成为了众多开发者的首选平台。然而,瑞芯微官方文档虽然提供了YOLO11预训练模型的部署方案,但对于需要自定义数据集训练的开发者来说,从模型训练到板端部署的完整流程却缺乏详细指导。本文将带你走完从环境搭建、数据准备、模型训练到最终板端部署的完整技术路线,并分享实际开发中遇到的各种坑点和解决方案。让我们一起探索如何在RK3568平台上实现30FPS稳定推理的YOLO11目标检测应用!

LXY_LOVE36的博客 120

Win32( 线程控制_CONTEXT结构体)

终止线程。

2301_77816603的博客 1283

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WIN32多线程一 用WIN32 API创建和结束线程

Win32中,内核对象属于WINDOWS的,而不属于进程。进程对象、线程对象、文件对象、文件映射对象、事件对象、互斥量对象等都属于内核对象。WIN32中一般通过CreateXXXX来创建内核对象,返回一个内核对象的句柄,进程不能直接操作内核对象,只能通过该句柄来访问内核对象。内核对象有一个使用计数,一个进程的内核对象句柄表中引用了某个内核对象,该内核对象的使用计数就递增1,该进程调用CloseHa...

cpongo5 278

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Win32多线程】创建线程、获取线程执行状态、退出线程、错误处理

产生一个线程: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD描述施行与这一新线程的security属性,NULL表示使用缺省值,在windows 95中忽略该参数 DWORD dwStackSize, // initial stack size新线

xiaoding133的专栏【Stay hungry,Stay foolish】 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Win32线程——在某个线程内终止另一个正在运行的线程(2)(Event对象)

《Win32多线程程序设计》 Win32 中最具弹性的同步机制就属 events 对象了。 Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态。这两种状态全由程序来控制,不会成为Wait…() 函数的副作用。 Event 对象之所以有大用途,正是因为它们的状态完全在你掌控之下。Mutexes 和 sem aphores 就不一样了,它们的状态会因为诸如WaitForS

SangYang 2868

《Win32多线程程序设计》(10)---如何终止一个线程

结束一个线程,听起来好容易,但是结束程序必须按次序进行,以避免发生race  conditions。让程序依次序进行是非常重要的,特别是在程序要结束之前。结束一个程序就好像拆除一栋建筑物一样,在你以推土机轧平它之前,你必须确定每一个人都安全离开了屋子。结束一个程序也是这样,每一个线程都被迫结束,不管它进行到哪里。 利用 TerminateThread() 放弃一个线程 BOOL Termi

一零一六的博客专栏 1079

Win32多线程 -- 判断线程结束

相关函数 1. GetExitCodeThread BOOL GetExitCodeThread( HANDLE hThread, // handle to the thread LPDWORD lpExitCode // termination status ); 如果线程已经结束, lpExitCode 将会取得线程的返回值, 如果还未结束, lpExitCode的值是STILL_ACTIVE。这并不是好方法,因为线程的返回可能就是STILL_ACTIVE, 而这时线程已经结束。...

cfz751740465的博客 1107

【Python】线程的创建、执行、互斥、同步、销毁

还是《【Java】利用synchronized(this)完成线程的临界区》(点击打开链接)、《【Linux】线程互斥》(点击打开链接)、《【C++】Windows线程的创建、执行、互斥、同步、销毁》(点击打开链接)中的设置多个线程对一个ticket进行自减操作,用来说明Python中多线程的运用,涉及的创建、执行、互斥、同步、销毁问题。 运行结果如下,还是差不多,运行三次,每次的运行结果,每个

编程记录,亲测有效 8214
上一篇: 【Win32多线程】同步机制(Critical section、Mutexes、Semaphore、Event Object)
下一篇: 【Win32多线程】异步I/O技术(Overlapped I/O),避免使用多线程
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值