为了账号安全,请及时绑定邮箱和手机立即绑定

(C++多线程问题)CreateThread()函数问题?

(C++多线程问题)CreateThread()函数问题?

Helenr 2019-02-24 10:06:18
CreateThread()里的六个参数里的第3个和第四个参数(LPTHREAD_START_ROUTINE lpStartAddress和 LPVOID lpParameter)要怎么填?另外还要定义什么东西?还有填进去的东西到底是什么意思?
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

一、Windows API函数。该函数在主线程的基础上创建一个新线程。微软在Windows API中提供了建立新的线程的函数CreateThread。

二、CreateThread将在主线程的基础上创建一个新线程,大致做如下步骤:


1.在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回


2.把线程退出码置为STILL_ACTIVE,把线程挂起计数置1


3.分配context结构


4.分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD


5.lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数


6.把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数

三、MSDN中CreateThread原型:


HANDLE CreateThread(


LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD


SIZE_T dwStackSize,//initialstacksize


LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction


LPVOID lpParameter,//threadargument


DWORD dwCreationFlags,//creationoption


LPDWORD lpThreadId//threadidentifier


)


processthreadsapi.h中CreateThread原型:


WINBASEAPI


_Ret_maybenull_


HANDLE


WINAPI


CreateThread(


_In_opt_LPSECURITY_ATTRIBUTES lpThreadAttributes,


_In_SIZE_T dwStackSize,


_In_LPTHREAD_START_ROUTINE lpStartAddress,


_In_opt___drv_aliasesMemLPVOID lpParameter,


_In_DWORD dwCreationFlags,


_Out_opt_LPDWORD lpThreadId


);


四、示例:



查看完整回答
反对 回复 2019-03-27
?
郎朗坤

TA贡献1921条经验 获得超9个赞

关于六个参数:第一个是所创线程的安全属性,多设置为NULL; 第二个是所创线程堆栈的大小,多设为0; 第三个是你创建的线程的地址;(此处应为你的线程函数的函数名) 第四个是传递给你的线程函数的参数; 第五个是表示你创建的线程是否立即执行,设为0则立即执行; 第六个则是你创建线程的ID号,设为NULL就行。关于线程你要知道他有一个对应的线程函数,你创建线程后即执行你的函数(若你指定第五个参数为0立即执行,所执行的函数即为第三个参数)对于二楼他设置了一个等待,若无此等待可能会导致创建线程的函数已经退出,而你的线程却还在运行。

查看完整回答
反对 回复 2019-03-27
  • 3 回答
  • 0 关注
  • 1689 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信