多线程学习笔记 一

 产生一个多线程是以 CreateThread()作为一切行动的开始。此函数原型如下:
HANDLE CreateThread(
             LPSECURITY_ATTRIBUTES lpThreadAttributes,
             DWORD dwStackSize,
             LPTHREAD_START_ROUTINE lpStartAddress,
             LPVOID lpParameter,
             DWORD dwCreationFlags,
             LPDWORD lpThreadId                       
);

参数说明:
lpThreadAttributes  描述施行于这一新线程的 security 属性,NULL 表示使用缺省值。
dwStackSize  新线程拥有自己的堆栈。0表示使用缺省大小。
lpStartAddress  新线程将开始的起始地址,这是一个函数指针。(在C语言中函数名称即代表函 数指针,所以这里可放一个函数名称)

lpParameter  此值将被传送到上述所指定之新线程函数去,作为线程函数的参数。
dwCreationFlags  允许你产生一个暂时挂起的线程,默认情况是立即开始执行,若值为 CREATE_SUSPENDED 挂起线程直到调用 ResumeThread( HANDLE hThread ); 来启动挂起的线程。
lpThreadId  新线程ID 会被传回到这里。

返回值:
  如果CreateThread()成功,传回一个handle,代表新线程,否则传回一个FALSE,如果失败你可以调用GetLastError()获知原因。

事例程序:
#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

DWORD WINAPI ThreadFunc(LPVOID);

int main()
{
    HANDLE hThrd;
    DWORD threadId;
    int i;
   
    for (i=0; i<5; i++)
    {
        hThrd = CreateThread(NULL,
            0,
            ThreadFunc,
            (LPVOID)i,
            0,
            &threadId );
        if (hThrd)
        {
            printf("Thread launched %d/n", i);
            CloseHandle(hThrd);
        }
    }
    // Wait for the threads to complete.
    // We'll see a better way of doing this later.
    Sleep(2000);

    return EXIT_SUCCESS;
}

DWORD WINAPI ThreadFunc(LPVOID n)
{
    int i;
    for (i=0;i<10;i++)
        printf("%d%d%d%d%d%d%d%d/n",n,n,n,n,n,n,n,n);
    return 0;
}

特别注意ThreadFunc()的函数定义:
DWORD WINAPI ThreadFunc(LPVOID n)
CreateThread()的函数声明中期望第三个参数是个函数指针,指向某种待定类型的函数:返回值为 DWORD ,调用约定是 WINAPI 有一个 LPVOID 参数。换句话说,如果你的线程函数不符合这些要求,编译时便会出现错误信息。一开始就精准的声明正确的函数类型,比日后再强制转换(cast)好。

线程结束代码(Exit Code)
线程结束代码可以籍着调用GetExitCodeThread()(并给予 CreateThread 所获得的线程ID作为参数)而得知:
BOOL GetExitCodeThread(
                       HANDLE hThread,
                       LPDWORD lpExitCode);
参数说明:
hThread  由CreateThread()传回的线程 handle
lpExitCode  指向一个DWORD,用以接受结束代码(exitcode)

返回值:
  如果成功,GetExitCodeThread()传回TRUE,否则传回FALSE。如果失败你可以调用GetLastError()找出原因。如果线程已经结束,那么线程的结束代码会被放在 lpExitCode 参数中带回来。如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值