使用CreateThread函数创建线程

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

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

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

HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadID );

参数的含义如下:

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

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

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

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

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

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

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

DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds );

参数的含义如下:

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

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

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

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

使用临界区的步骤如下:

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

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

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

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

#include 
  
    #include 
   
     HANDLE hFile; CRITICAL_SECTION cs;//定义临界区全局变量 //线程函数:在文件中写入10000个hello DWORD WINAPI Thread(LPVOID lpParam) {     int n = (int)lpParam;     DWORD dwWrite;     for (int i = 0;i < 10000;i++)     {         //进入临界区         EnterCriticalSection(&cs);         char data[512] = "hello\r\n";         //写文件         WriteFile(hFile, data, strlen(data), &dwWrite, NULL);         //离开临界区         LeaveCriticalSection(&cs);     }     printf("Thread #%d returned successfully\n", n);     return 0; } int main() {     char *filename = "hack.txt";     WCHAR name[20] = { 0 };     MultiByteToWideChar(CP_ACP, 0, filename, strlen(filename) + 1, name, sizeof(name) / sizeof(name[0]));     //创建文件     hFile = CreateFile(name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);     if (hFile == INVALID_HANDLE_VALUE)     {         printf("CreateFile error.\n");         return 0;     }     DWORD ThreadID;     HANDLE hThread[5];     //初始化临界区     InitializeCriticalSection(&cs);     for (int i = 0;i < 5;i++)     {         //创建线程,并调用Thread写文件         hThread[i] = CreateThread(NULL, 0, Thread, (LPVOID)(i + 1), 0, &ThreadID);         printf("Thread #%d has been created successfully.\n", i + 1);     }     //等待所有进程结束     WaitForMultipleObjects(5, hThread, TRUE, INFINITE);     //删除临界区     DeleteCriticalSection(&cs);     //关闭文件句柄     CloseHandle(hFile);     return 0; } 
    
  

结果如图:

使用CreateThread函数创建线程


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/217803.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午8:43
下一篇 2026年3月18日 上午8:44


相关推荐

  • DateUtil整理

    DateUtil整理背景 DateUtil 整理 便于使用 注 其中大部分功能 jdk 自带或使用第三方工具类即可 推荐使用 hutool 其还有很多方便使用的工具类 dependency groupId cn hutool groupId artifactId hutool all artifactId version 5 3 7 version dependency 特殊

    2026年3月16日
    2
  • PyCharm 界面介绍

    PyCharm 界面介绍从整体界面来看 PyCharm 分为菜单栏区域 项目结构区域 代码区域 运行信息区一 菜单栏 1 File 文件 2 Edit 编辑 Find 编辑窗口中用的最多的就是 Find 选项中的 例如 Ctrl F 文件内查找 Ctrl Shift F 项目中搜索 3 View 视图 T

    2026年3月27日
    2
  • int、bigint、smallint 和 tinyint范围「建议收藏」

    int、bigint、smallint 和 tinyint范围「建议收藏」1bytes=8bit,一个字节最多可以代表的数据长度是2的8次方11111111在计算机中也就是  -128到127  1.BIT[M]  位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1  2.TINYINT[(M)][UNSIGNED][ZEROFILL] M默认为4       从0到255的整型数据。存储大小为1

    2026年2月8日
    7
  • OTOClaw – 智能龙虾,一键部署OpenClaw龙虾、轻松养龙虾

    OTOClaw – 智能龙虾,一键部署OpenClaw龙虾、轻松养龙虾

    2026年3月16日
    3
  • INSERT INTO SELECT 实例

    INSERT INTO SELECT 实例需求:   把一个表中特定的2列查询出来,然后插入到另外一张表,插到另一张表的其他列的值是固定值。要插入的表,插入全部内容时是这样的:INSERTINTO`mapping_record`(id,mapping_record.type,sim_id,wx_id,created_time,updated_time,is_available)VALUES(uuid(),’94

    2022年7月15日
    19
  • 牛顿法和梯度下降法_最优化次梯度法例题

    牛顿法和梯度下降法_最优化次梯度法例题我们每个人都会在我们的生活或者工作中遇到各种各样的最优化问题,比如每个企业和个人都要考虑的一个问题“在一定成本下,如何使利润最大化”等。最优化方法是一种数学方法,它是研究在给定约束之下如何寻求某些因素

    2022年8月5日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号