CreateThread函数

C++开发基础之CreateThread详细用法 在上面的示例中,我们首先创建了一个信号量 semaphore,然后使用 CreateThread 创建了一个新的线程,并将线程函数设置为 MyThreadFunction。该函数返回之前的线程亲和性掩码,可以用来还原之前的设置。GetThreadAffinityMask和SetThreadAffinityMask是Windows API提供的两个函数,用于获取和设置线程的亲和性掩码。在调用CreateThread函数后,新线程将开始运行指定的线程函数,并且可以访问该函数中的参数。 阅读详情

线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。

在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下:

  1. HANDLE CreateThread(  
  2.                     LPSECURITY_ATTRIBUTES lpThreadAttributes,  
  3.                     DWORD dwStackSize,  
  4.                     LPTHREAD_START_ROUTINE lpStartAddress,  
  5.                     LPVOID lpParameter,  
  6.                     DWORD dwCreationFlags,  
  7.                     LPDWORD lpThreadID  
  8.                    );  
参数的含义如下:

lpThreadAttrivutes:指向SECURITY_ATTRIBUTES的指针,用于定义新线程的安全属性,一般设置成NULL;

dwStackSize:分配以字节数表示的线程堆栈的大小,默认值是0;

lpStartAddress:指向一个线程函数地址。每个线程都有自己的线程函数,线程函数是线程具体的执行代码;

lpParameter:传递给线程函数的参数;

dwCreationFlags:表示创建线程的运行状态,其中CREATE_SUSPEND表示挂起当前创建的线程,而0表示立即执行当前创建的进程;

lpThreadID:返回新创建的线程的ID编号;

如果函数调用成功,则返回新线程的句柄,调用WaitForSingleObject函数等待所创建线程的运行结束。函数的格式如下:

  1. DWORD WaitForSingleObject(  
  2.                           HANDLE hHandle,  
  3.                           DWORD dwMilliseconds  
  4.                          );  
参数的含义如下:

hHandle:指定对象或时间的句柄;

dwMilliseconds:等待时间,以毫秒为单位,当超过等待时间时,此函数返回。如果参数设置为0,则该函数立即返回;如果设置成INFINITE,则该函数直到有信号才返回。

一般情况下需要创建多个线程来提高程序的执行效率,但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对一个内存地址进行写入操作,由于CPU时间调度的问题,写入的数据会被多次覆盖,所以要使线程同步。

就是说,当有一个线程对文件进行操作时,其它线程只能等待。可以通过临界区对象实现线程同步。临界区对象是定义在数据段中的一个CRITICAL_SECTION结构,Windows内部使用这个结构记录一些信息,确保同一时间只有一个线程访问改数据段中的数据。

使用临界区的步骤如下:

(1)初始化一个CRITICAL_SECTION结构;在使用临界区对象之前,需要定义全局CRITICAL_SECTION变量,在调用CreateThread函数前调用InitializeCriticalSection函数初始化临界区对象;

(2)申请进入一个临界区;在线程函数中要对保护的数据进行操作前,可以通过调用EnterCriticalSection函数申请进入临界区。由于同一时间内只能有一个线程进入临界区,所以在申请的时候如果有一个线程已经进入临界区,则该函数就会一直等到那个线程执行完临界区代码;

(3)离开临界区;当执行完临界区代码后,需要调用LeaveCriticalSection函数离开临界区;

(4)删除临界区;当不需要临界区时调用DeleteCriticalSection函数将临界区对象删除;

下面的代码创建了5个线程,每个线程在文件中写入10000个“hello”:

  1. #include <stdio.h>  
  2. #include <windows.h>  
  3. HANDLE hFile;  
  4. CRITICAL_SECTION cs;//定义临界区全局变量  
  5. //线程函数:在文件中写入10000个hello  
  6. DWORD WINAPI Thread(LPVOID lpParam)  
  7. {  
  8.     int n = (int)lpParam;  
  9.     DWORD dwWrite;  
  10.     for (int i = 0;i < 10000;i++)  
  11.     {  
  12.         //进入临界区  
  13.         EnterCriticalSection(&cs);  
  14.         char data[512] = "hello\r\n";  
  15.         //写文件  
  16.         WriteFile(hFile, data, strlen(data), &dwWrite, NULL);  
  17.         //离开临界区  
  18.         LeaveCriticalSection(&cs);  
  19.     }  
  20.     printf("Thread #%d returned successfully\n", n);  
  21.     return 0;  
  22. }  
  23. int main()  
  24. {  
  25.     char *filename = "hack.txt";  
  26.     WCHAR name[20] = { 0 };  
  27.     MultiByteToWideChar(CP_ACP, 0, filename, strlen(filename) + 1, name, sizeof(name) / sizeof(name[0]));  
  28.     //创建文件  
  29.     hFile = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  
  30.     if (hFile == INVALID_HANDLE_VALUE)  
  31.     {  
  32.         printf("CreateFile error.\n");  
  33.         return 0;  
  34.     }  
  35.     DWORD ThreadID;  
  36.     HANDLE hThread[5];  
  37.     //初始化临界区  
  38.     InitializeCriticalSection(&cs);  
  39.     for (int i = 0;i < 5;i++)  
  40.     {  
  41.         //创建线程,并调用Thread写文件  
  42.         hThread[i] = CreateThread(NULL, 0, Thread, (LPVOID)(i + 1), 0, &ThreadID);  
  43.         printf("Thread #%d has been created successfully.\n", i + 1);  
  44.     }  
  45.     //等待所有进程结束  
  46.     WaitForMultipleObjects(5, hThread, TRUE, INFINITE);  
  47.     //删除临界区  
  48.     DeleteCriticalSection(&cs);  
  49.     //关闭文件句柄  
  50.     CloseHandle(hFile);  
  51.     return 0;  
  52. } 
Windows C++多线程:使用CreateThread函数创建线程 该函数打印出传递给它的字符串参数。然后我们使用CreateThread函数创建两个线程,分别传递不同的字符串参数,并分别输出这两个字符串。在C++编程中,多线程是一个必不可少的部分,使用多线程技术可以充分利用多核CPU的资源,提升程序的处理能力。下面是一个简单的例子,使用CreateThread函数创建两个线程,分别输出 “Hello from Thread 1” 和 “Hello from Thread 2”。总之,使用CreateThread函数可以很方便地创建线程,提升程序性能。 阅读详情

相关推荐

createthread函数用法详解

详细介绍了createthread函数 在程序中的运用 对于c++多线程的学习有很大帮助

采用CreateThread()创建多线程程序

采用CreateThread()创建多线程程序 在window环境下,Win32 提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作: 1、主要的函数列表: 序号 函数名 功能 1 CreateThread() 创建一个新线程 2 ExitThread() 正

cbNotes的专栏:不积硅步,无以至千里;不积小流,无以成江海! 6万+

[TI板]MSPM0G3507——keil环境配置+烧录配置+vscode配置+空工程迁移+点灯+芯片解锁教程

本文介绍了MSPM0G3507开发环境的配置与烧录方法。主要内容包括:1)下载安装芯片支持包和SDK开发工具;2)通过串口或DAPLink两种方式实现程序烧录,详细说明了UniFlash软件的使用步骤和常见问题解决方法;3)简要提及工程迁移和LED点灯等基础操作。文章提供了完整的开发环境搭建指南,涵盖从软件安装到实际烧录的全过程,并附有相关工具下载链接和操作截图,帮助开发者快速上手MSPM0G3507开发。

qq_23220445的博客 1万+

delphi 多线程-CreateThread

function CreateThread(  lpThreadAttributes: Pointer;           {安全设置}  dwStackSize: DWORD;                    {堆栈大小}  lpStartAddress: TFNThreadStartRoutine; {入口函数}  lpParameter: Pointer;              ...

weixin_33916256的博客 1133

Matlab PolySpace 静态分析实战:从零搭建嵌入式代码安全防线

本文详细介绍了如何使用Matlab PolySpace进行嵌入式代码静态分析,从环境搭建到实战配置,帮助开发者提前发现内存溢出、未初始化变量等潜在缺陷。通过案例分享和进阶技巧,展示如何提升代码安全性和可靠性,特别适合汽车ECU、医疗设备等安全关键系统开发。

weixin_33701617的博客 602

基于python的排课表系统,用python编写排课系统

实现一个具体的课程管理系统。(5) 学生可以查看自己选上的课的成绩,以及各个课程的得分、绩点,并给出其平均绩点,但不允许查看年级其他人的成绩。(2) 学生定制专属课表,可以查看整个学期本人的课程安排,包括课程名称、上课时间、上课地点、任课老师、学分等等。(13) 系主任可以查看整个系的全部学生以及他们的平均绩点,可以对每个班进行排名,或者也可以对整个系进行排名。(15) 系主任可以查看整个学期所开设的所有课程,包括这些课程的全部详细信息。(1) 学生基本信息的查询,学生可以对本人的系统登陆密码进行修改。

yang0728y的博客 2000

CreateThread函数的用法

可以把CreateThread函数的第四个参数pListDialogID传给回调函数的参数; SSN_RETURN PiShowListDialog(__in SSN_OBJECT_ID ListType, __in SSN_OBJECT_ID ListDialogID) {  if ((ListType.nCreaterPlugInId==SSN_UI_LIST_TYPE_LINK.nCr

xlm289348的专栏 1992

ArcGIS Pro 制作这种地图海报

ArcMap 版本与 ArcGIS Pro 版本的制图功能相差太多,无论从美观上还是制图效率都远远优于 ArcMap,用了一段时间的 ArcGIS Pro ,真心推荐有条件的大家赶紧试一试!一个软件也能搞定一张不错的海报哦!----吐槽:好的设计真的是门花时间的活,这个教程大概花了我7小时左右,我都忘了我自己教程中截图多少张了!(可能是我速度太慢了)测试数据:阿里云盘分享-----北极海冰数据.https://www.aliyundrive.com/s/SUhsnqfkmXh。

J_Giser的博客 1430

CreateThread()函数使用

函数所在头文件 #include<windows.h> CreateThread()函数原型 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程安全属性 DWORD dwStackSize, //线程初始栈大小 LPTHREAD_START_ROUTINE lpStartAddress, //线程函数入口,通常用线程函数名 LPVOID lpParameter, //给新线程函数传递参数 DWORD dwCre

weixin_45918830的博客 2383

Python 爬虫实战:深入闲鱼平台,抓取二手好物价格波动数据

本文介绍了如何利用Python爬虫抓取闲鱼(Xianyu)二手交易平台的商品价格数据并分析其波动趋势。通过requests和BeautifulSoup库实现网页数据抓取与解析,使用pandas进行数据清洗和存储,最后借助matplotlib可视化价格波动情况。文章详细展示了从网页结构分析、数据采集到波动率计算和趋势可视化的完整流程,并建议通过定时任务实现持续数据更新。该项目能为二手市场交易者提供价格参考,帮助优化买卖决策。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 3377

Sigrity System Explorer Transient Analysis模式进行瞬态仿真分析操作指导-单端信号

Sigrity System Explorer Transient Analysis模式可以用于瞬态仿真分析,通过搭建简易拓扑用于前仿真分析通道的时域性能,下面搭建一个简易的单端拓扑进行说明,以下图为例,准备好发送接收端的IBIS模型, (ibis_se.ibs,本例发送接收端都使用相同的IBIS模型),以及传输线的S参数模型(welement_se.sp)最上方的图形界面是传输线的模型,本例是一个上下都有参考平面的带状线,右侧的梯形是蚀刻角度,根据W1和W2以及铜厚来确定。

weixin_54787054的博客 419

c语言createthread函数用法,CreateThread函数

当使用CreateProcess调用时,系统将创建一个进程和一个主线程。CreateThread将在主线程的基础上创建一个新线程,大致做例如以下步骤:1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回2把线程退出码置为STILL_ACTIVE。把线程挂起计数置13分配context结构4分配两页的物理存储以准备栈。保护页设置为PAGE_READWRITE。第2页设为PA...

weixin_39542477的博客 1797

qq邮箱发错误:The “From“ header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard pro

如果还报错 (550, b’The mail may contain inappropriate words or content.'),可能是你message[‘From’]中的< senderxxx@qq.com >发送邮箱填错了,必须要和self.sender = ’ senderxxx@qq.com '一样。可能是之前qq邮箱发送协议存在漏洞,可隐藏发送者邮箱。现在换了新协议,导致与原来协议规则、编码出现了一些问题。"python自动发送""python自动发送"

云霄IT的博客 3670

使用CreateThread函数创建线程

线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。 在C/C++中可以通过CreateThread函数在进程中创建线程,函数的具体格式如下: HANDLE CreateThread(

Valineliu 6万+

基于FPGA的以太网设计(1)----大白话解释什么是以太网

基于FPGA的千兆以太网设计(1)----大白话解释什么是以太网

孤独的单刀 3877

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++使用CreateThread函数创建线程

使用CreateThread函数创建线程 线程是进程中的一个实体,是被系统独立调度和分派的基本单位。一个进程可以拥有多个线程,但是一个线程必须有一个进程。线程自己不拥有系统资源,只有运行所必须的一些数据结构,但它可以与同属于一个进程的其它线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行。 函数的原型: HANDLE CreateThread( ​ LPSECURITY_ATTRIBUTES lpThreadAttributes, ​ DWORD dw

qq_41924554的博客 5448

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

createThread函数的使用

改变了栈的大小,但是把CreateThread的第2参数改成0x100000或者更小的时候,程序还是会出现这样的问题,只有将栈的大小还原为默认值,且CreateThread的第2参数为0 才能正确运行详细的请查看:http://topic.youkuaiyun.com/u/20090905/15/7bf41679-3ed9-40b5-ac71-5f11c088984c.html 微软在Window

allen_1986的专栏 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言createthread函数详解,CreateThread()使用实例

一、函数解释(参见MSDN)The CreateThread function creates a thread toexecute within the virtual address space of the callingprocess.To create a thread that runs in the virtual address space ofanother process, u...

weixin_33553272的博客 1812

C++ CreateThread 线程函数传参

HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 内核对象的安全属性,一般传入NULL _In_ SIZE_T dwStackSize, // 线程栈空间大小,传入0表示使用默认大小 _I...

LYSM 3091

windows编程学习——CreateThread()函数

CreateThread()函数介绍: HANDLE CreateThread(   LPSECURITY_ATTRIBUTES     lpThreadAttributes,        //指向SECURITY_ATTRIBUTES的指针,NULL默认为安全,不可被子线程继承   DWORD                                    dwStackSize,  ...

Cry_Alone的博客 2187

CreateThread创建线程函数详细讲解

CreateThread CreateThread函数创建一个要在调用进程的地址空间中执行的线程。(MSDN讲解如下) 处理CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, //指向安全属性的指针 dwStackSize, //初始线程堆栈大小 说明:LPTHREAD_START_ROUTINE lpStartAddress, //指...

物联网小镇的博客 3280

CreateThread函数用法

该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。 CreateThread步骤 CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤: 1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回 2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1

欢迎来到打不死的小强的专栏 6031

c语言createthread函数用法,C++多线程函数CreateThread如何使用?

C++ CreateThread函数如何传递this指针作为参数C++多线程函数CreateThread如何使用?#include #include using namespace std; /* HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_STA_ROUTI...

weixin_35033679的博客 1054
上一篇: IplImage访问图像像素值
下一篇: Mat和IplImage相互转换
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值