Windows线程挂起和Context

这篇具有很好参考价值的文章主要介绍了Windows线程挂起和Context。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Windows线程挂起和Context

一、线程挂起(暂停)

1、SuspendThread用来暂停一个线程的执行,线程暂停时,不会被调度执行

2、ResumeThread用来恢复一个暂停线程的执行(一个暂停的线程无法调用这个方法来恢复自己,

3、因为暂停的线程不可能被执行)暂停县城总是立即被暂停,而不管被暂停的线程执行到了哪个指令

线程内核对象内部,存储了一个暂停计数的值,每调用一次,SuspendThread方法该值就加1,调用ResumeThread一次该值就减1当该值为0时,就表示该线程可以被调用执行了,但不会被立即执行,所以多次被Suspend的线程不能期望调用一次Resume方法就恢复

4、这两个方法入口参数为线程的句柄

5、线程函数内部可以通过Sleep或者SleepEx方法自行暂停一定时间后自动恢复执行,但是这个暂停时间对于系统调度程序来说只是一个参考值,调度程序不能保证精确的暂停指定的时长,通常暂停时长会长于指定的暂停时长

二、线程的暂停式创建(下面例子1)

1、在调用CreateThread创建线程时,可以明确指定以暂停方式创建线程(CREATE_SUSPENDED)

2、如果没有暂停方式执行的话,创建线程的行为将比较难以控制,有可能调度程序在CreateThread返回

前就开始执行新线程,也有可能在返回之后才去调度执行新线程,很难预期

3、所以,推荐创建线程都以暂停标志创建知道CreateThread返回,并做了一些必要的处理后,再使用

ResumeThread方法恢复新建的线程使其有机会被执行

4、这种创建线程的方式被称为暂停式创建

5、GRSLib都使用这种方式来新建线程

三、现成的CONTEXT环境(寄存器状态)

1、当新线程暂停时,可以使用GetThreadContext函数得到线程的寄存器环境,被称为线程上下文或环境块

2、该结构定义再MSDN无说明,需要在WinNT.h中查看

3、使用CONTEXT时,需要对其成员ConTextFlags,指定一系列需要得到的寄存器值的标志

4、一般给CONTEXT_ALL或者CONTEXT_FULL值即可得到主要的CPU寄存器的值,其余值再WinNT.h

中定义

5、修改CONTEXT中的对应寄存器变量的值后,可以通过调用SetThreadContext方法,将修改后的寄存器值

设置到线程中,然后再恢复线程的执行,就可以让线程使用新的寄存器的值

6、修改寄存器的方法一般用于调试或异常处理

7、不能通过这里描述的国产修改系统内核级的寄存器状态值,但可以得到他们(比如:CS,DS,SS,ES,FS,GS)

#include<windows.h>
#include<tchar.h>
#include<strsafe.h>
 
#define GRS_USEPRINTF() TCHAR pBuf[1024]={}
#define GRS_PRINTF(...)\
	StringCchPrintf(pBuf, 1024, __VA_ARGS__); \
	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
 
 
DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
	//线程函数
	GRS_USEPRINTF();
	GRS_PRINTF(_T("Thread(0x%x) Running!\n"),GetCurrentThreadId());
	return 0;
 
}
 
int _tmain()
{
	GRS_USEPRINTF();
	//以暂停方式创建线程
	HANDLE hThread = CreateThread(NULL,0,ThreadFunction,NULL,CREATE_SUSPENDED,NULL);
	ResumeThread(hThread);
	GRS_PRINTF(_T("Thread Resume!\n"));
	CloseHandle(hThread);
	_tsystem(_T("PAUSE"));
	return 0;
}
#include<windows.h>
#include<tchar.h>
#include<strsafe.h>
 
#define GRS_USEPRINTF() TCHAR pBuf[1024]={}
#define GRS_PRINTF(...)\
	StringCchPrintf(pBuf, 1024, __VA_ARGS__); \
	WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);
 
DWORD WINAPI ThreadFunction(LPVOID lpParam)
{
	//线程函数
	HANDLE hEvent = (HANDLE)lpParam;
	WaitForSingleObject(hEvent,INFINITE);
	CloseHandle(hEvent);
	return 0;
 
}
 
int _tmain()
{
	HANDLE hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
	HANDLE hEventDup = NULL;
	DuplicateHandle(GetCurrentProcess(),hEvent,GetCurrentProcess(),&hEventDup,
		DUPLICATE_SAME_ACCESS,FALSE,0);
	HANDLE hThread = CreateThread(NULL, 0, ThreadFunction, hEventDup, CREATE_SUSPENDED,NULL);
 
	ResumeThread(hThread);
	SuspendThread(hThread);
	
	CONTEXT ct = {};
	ct.ContextFlags = CONTEXT_ALL;
	GetThreadContext(hThread,&ct);
 
	ResumeThread(hThread);
	SetEvent(hEvent);
	CloseHandle(hEvent);
 
 
	_tsystem(_T("PAUSE"));
	return 0;
}

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器文章来源地址https://www.toymoban.com/news/detail-542005.html

到了这里,关于Windows线程挂起和Context的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程状态&&僵尸进程和孤儿进程&&阻塞、挂起和运行

    个人主页 : zxctscl 如有转载请先通知 上一篇博客中提到 【Linux】进程初步理解,这次继续来分享与进程有关的知识。 Linux的进程状态就是struct task_struct内部的一个属性。 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在

    2024年04月14日
    浏览(29)
  • mac上使用虚拟机vm, 里面的镜像挂起会占用电脑的内存吗, 挂起和关机的区别是什么, 会影响正常电脑的内存和硬盘使用吗

    在Mac(或任何其他操作系统)上使用虚拟机(如VMware Fusion、Parallels Desktop、VirtualBox等)时,“挂起”(Suspend)和“关机”(Power Off或Shut Down)是两种不同的虚拟机状态,它们对主机系统的资源使用有所不同。 挂起(Suspend) : 当你挂起虚拟机时,虚拟机的当前状态(包括内存

    2024年02月08日
    浏览(36)
  • 【STM32&RT-Thread零基础入门】 6. 线程创建应用(线程挂起与恢复)

    硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线 在上一个任务中,通过停止命令把线程删除后,线程在系统中就不存在了,也无法再使线程重新运行。例如输入stop_led_thread命令后,led停止闪烁,但也无法重新开启LED灯闪烁

    2024年02月11日
    浏览(25)
  • 【linux 多线程并发】多线程的控制,挂起线程暂停运行,直到唤醒线程,取消线程运行,可以设置合适的取消点属性避免不安全点被中止

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年01月20日
    浏览(29)
  • 【Windows线程开发】Windows线程同步技术

    我们在上一章节中讲解了关于Windows的线程基础,相信大家已经对线程有了基本的概念。这一章节中,我们来讲讲线程同步技术,包括加锁技术(原子锁和互斥体)和事件,信号量。 原子锁主要解决的问题是多线程在操作符方面的问题。 相关问题: 多个线程对同一个数据进行

    2024年02月04日
    浏览(43)
  • FreeRTOS如何解决访问冲突/线程不安全(临界段、互斥锁、挂起调度、看门人任务)

    在多任务(多线程)系统中,存在一个隐患,那就是多线程的访问(在FreeRTOS中就是任务)。当一个任务A开始访问一个资源(外设、一块内存等),但是A还没有完成访问,B任务运行了,也开始访问,这就会造成数据破坏、错误等问题。 例如: 两个任务试图写入一个液晶显示

    2024年02月07日
    浏览(39)
  • 【Windows线程开发】线程基础

    本篇文章来带领大家了解Windows线程,了解线程的基本概念,了解线程的创建方式,以及一些简单的线程操作。 Windows线程是可以执行的代码的实例,系统是以线程为单位调度程序。一个程序中可以有多个线程,实现多任务的处理。 Windows线程的特点: 每个线程都具有一个ID 每

    2024年02月04日
    浏览(34)
  • windows C++多线程同步<3>-互斥量

    概念,如下图: 另外就是互斥对象谁拥有,谁释放 那么一个线程允许多次获取互斥对象吗? 答案是允许,但是申请多次就要释放多次,否则其他线程获取不到互斥对象;同一个线程可以多次获取,即使不释放也可以,但是这种做法有问题极易导致线程同步出现异常,强烈不

    2024年02月14日
    浏览(65)
  • 在windows设置自己的cmd开机自启动程序,并且一直后台运行不挂起

    要在 Windows 上设置开机自启动程序,可以按照以下步骤进行: 打开「运行」对话框(可使用 Win + R 快捷键),然后输入 shell:startup 命令打开「启动」文件夹。 在「启动」文件夹中创建一个名为 xxxx.bat(xxxx 为你想要的程序名)的批处理文件,用于启动你的 CMD 程序。例如:

    2024年02月01日
    浏览(33)
  • C++ Qt开发:运用QThread多线程组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用 QThread 组件实现多线程功能。 多线程技术在程序开发中尤为常用,Q

    2024年03月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包