C语言多线程学习

VC6++环境下C语言创建多线程

1.简单的创建多线程实例

    #include <stdio.h>
    #include <windows.h>
    //子线程函数
    DWORD WINAPI ThreadFun(LPVOID pM){
        printf("子线程的线程ID号为:%d\n子线程输出 Hello World\n", GetCurrentThreadId());
        return 0;
    }
    //主函数,所谓主函数其实就是主线程执行的函数。
    int main()
    {
        printf("最简单的创建多线程实例\n");
        printf("http://zfblog.xyz");

        HANDLE handle = CreateThread(NULL, 0, ThreadFun, NULL, 0, NULL);
        WaitForSingleObject(handle, INFINITE);
        return 0;
    }

使用CreateThread函数创建线程

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

第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置
第二个参数表示线程栈空间大小,传入0表示使用默认大小(1MB)
第三个参数表示新线程所执行的线程函数地址
       多个线程可以使用同一个函数地址(线程函数入口)
第四个参数是传给线程函数的参数
第五个参数指定额外的标志来控制线程的创建
       就是控制线程何时运行
       为0:直接运行
       为CREATE_SUSPENDED:调用ResumeThread()后运行
第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号
函数返回值:成功返回新线程的句柄,失败返回NULL

2.关于CreateThread()给线程函数传递参数的问题

    //创建线程时传递参数
    int *parameter;
    CreateThread(NULL, 0, ThreadFun, (void *)parameter, 0, NULL);
    //想到一个问题直接使用全局的static变量会出现什么情况?????
    //parameter是任意类型的地址
    //线程函数中调用参数
    DWORD WINAPI ThreadFun(LPVOID pM)
    {
            //传入的地址指向一个int类型的数据
            int p=*PM;
            return 0;
    }

WaitForSingleObject函数作用

    DWORD  WINAPI  WaitForSingleObject(
            HANDLE   hHandle,
            DWORD   dwMilliseconds
    );

第一个参数为要等待的内核对象
第二个参数为最长等待的时间
      为5000:等待5秒
      为0:立即执行
      为INFINITE:无限等待
函数返回值:WAIT_OBJECT_0在指定的时间内对象被触发
      WAIT_TIMEOUT超过最长等待时间对象仍未被触发
      WAIT_FAILED传入参数有错误
函数作用
首先要知道----线程的句柄在线程运行时是未触发的,结束后触发
在主函数中调用等待线程执行完毕,然后主函数结束
不用此函数可能会导致线程没有执行完,主函数结束,程序结束