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

CreateThread()里的六个参数里的第3个和第四个参数(LPTHREAD_START_ROUTINElpStartAddress和LPVOIDlpParamete... CreateThread()里的六个参数里的第3个和第四个参数(LPTHREAD_START_ROUTINE lpStartAddress和 LPVOID lpParameter)要怎么填?另外还要定义什么东西?还有填进去的东西到底是什么意思?要详细才给分哦。。。 展开
 我来答
mike
推荐于2016-04-01 · 知道合伙人教育行家
mike
知道合伙人教育行家
采纳数:15109 获赞数:42258
担任多年高三教学工作。

向TA提问 私信TA
展开全部

一、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

);

四、示例:

匿名用户
2013-08-17
展开全部
关于六个参数:第一个是所创线程的安全属性,多设置为NULL; 第二个是所创线程堆栈的大小,多设为0; 第三个是你创建的线程的地址;(此处应为你的线程函数的函数名) 第四个是传递给你的线程函数的参数; 第五个是表示你创建的线程是否立即执行,设为0则立即执行; 第六个则是你创建线程的ID号,设为NULL就行。关于线程你要知道他有一个对应的线程函数,你创建线程后即执行你的函数(若你指定第五个参数为0立即执行,所执行的函数即为第三个参数)对于二楼他设置了一个等待,若无此等待可能会导致创建线程的函数已经退出,而你的线程却还在运行。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-17
展开全部
(1)LPTHREAD_START_ROUTINE lpStartAddress 指定了线程函数的起始地址,新建线程将从此地址开始执行,直到return语句返回,把控制权交给操作系统。
(2)LPVOID lpParameter 则是传递给线程函数的参数,也即传递给(1)中指定的线程函数的地址。
以下是一个例子:创建线程后,将转到线程函数执行,遇到return语句后返回到main函数。

#include <iostream>
#include <windows.h>

using namespace std;

/*ThreadProc为LPTHREAD_START_ROUTINE lpStartAddress
*参数指定的线程函数.lpParam则是LPVOID lpParameter指
*定的传递给线程函数的参数*/

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
for (int i = 0;i < 20;++i)
{
cout << "I am from a thread,count = " << i <<endl;
}

return 0;
}

int main()
{
HANDLE hThread;
DWORD dwThreadID;

hThread = ::CreateThread(
NULL,
NULL,
ThreadProc, // 线程入口地址
NULL,
0,
&dwThreadID);

::WaitForSingleObject(hThread,INFINITE);
::CloseHandle(hThread);

return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式