三十功名尘与土

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2730|回复: 1

WINDOWS32 API 创建多线程使用

[复制链接]

9

主题

9

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
39946
发表于 2023-2-26 10:02:29 | 显示全部楼层 |阅读模式
创建多线程函数

  1. HANDLE CreateThread(
  2.   [in, optional]    LPSECURITY_ATTRIBUTES   lpThreadAttributes,   //线程安全,一般都设置为NULL
  3.   [in]                  SIZE_T                  dwStackSize,                       //线程大小,设置为1M的倍数,比如1024,如果不满足会向上取整
  4.   [in]                  LPTHREAD_START_ROUTINE  lpStartAddress,     //线程执行函数
  5.   [in, optional]  __drv_aliasesMem LPVOID lpParameter,                //线程执行函数的参数,一个空指针,可以传递任何数据。
  6.   [in]                  DWORD                dwCreationFlags,                  //执行方式,0:创建后立即执行,CREATE_SUSPENDED:创建之后挂起,等待唤醒执行。
  7.   [out, optional]   LPDWORD             lpThreadId                          //指向接收线程标识符的变量的指针
  8. );
复制代码
使用案列
  1. DWORD threadHandle01, threadHandle02;
  2. CreateThread(NULL,1024,(LPTHREAD_START_ROUTINE)ThreadProceeFun1,&a,0,&threadHandle01);
  3. CreateThread(NULL, 1024, (LPTHREAD_START_ROUTINE)ThreadProceeFun2, NULL, 0, &threadHandle02);
复制代码
  1. DWORD ThreadProceeFun1(LPVOID lpParam)
  2. DWORD ThreadProceeFun2(LPVOID lpParam)
复制代码
互斥
创建互斥:
  1. HANDLE g_Mutex =  CreateMutex(NULL,FALSE,L"001");
复制代码

等待获取互斥信号
  1. WaitForSingleObject(g_Mutex, INFINITE);
复制代码
执行完毕之后释放互斥信号
  1. ReleaseMutex(g_Mutex);
复制代码
当多线程拥有对共享变量的访问权限时,这些函数执行原子加法可确保成功完成操作。
  1. InterlockedAdd、InterlockedIncrement、InterlockedDecrement等一系列函数
复制代码


多线程事件通信


  1. HANDLE g_EventHandle;

  2. DWORD ThreadProceeFun1(LPVOID lpParam) {
  3.    
  4.     while (true)
  5.     {
  6.         WaitForSingleObject(g_EventHandle, INFINITE); //阻塞获取信号
  7.         ResetEvent(g_EventHandle); //复位事件,变成无信号
  8.         cout << "---------" << endl;
  9.     }

  10.     return 0;
  11. }


  12. DWORD ThreadProceeFun2(LPVOID lpParam) {

  13.     while (true)
  14.     {
  15.         Sleep(1000);
  16.         SetEvent(g_EventHandle);//触发事件,设置为有信号。
  17.     }
  18.     return 0;
  19. }
复制代码



  1.     g_EventHandle = CreateEvent(NULL,TRUE,TRUE,NULL);
复制代码


CreateEvent

参数一:安全等级
参数二:手动true或者自动false复原信号
参数三:初始化状态,true表示有信号
参数四:事件名称,可以为NULL



回复

使用道具 举报

12

主题

52

帖子

134

积分

注册会员

Rank: 2

积分
134
发表于 4 天前 | 显示全部楼层
Konduracka E priligy canada Cochius JI, Mack K, Burns RJ
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|三十功名尘与土

GMT+8, 2024-11-24 11:55 , Processed in 0.057798 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表