一个简单的 Windows 下多线程创建 Demo

向往了多年,终于静下心来备战 IOCP,对于语言方面不缺少什么东西了,剩下的就是对操作系统和编程技巧的学习了,所以慢慢的开始写一些周边会涉及到的代码,也算是对 C/C++ 的复习,本文写的是一个 Windows 下多线程的例子,跟 Linux 下没什么区别,循环创建线程然后用堆上内存传递参数,代码有详细的注释可以参考。

参考学习地址:https://msdn.microsoft.com/zh-cn/office/ms682516(v=vs.71)

运行效果

2016-02-11_212502

你会发现创建的顺序并不是固定的,这就是多CPU情况下,多线程并行的一种效果,再深入以后,这也是多线程处理较麻烦的地方。

程序代码

#include <stdio.h>
#include <Windows.h>

#define MAX_THREADS 5

// 给线程传参的结构体
typedef struct MyData
{
    int val1;
    int val2;
} MYDATA, *PMYDATA;

DWORD WINAPI _WorkerThread(
    _In_ LPVOID lpParameter
    )
{
    // 将参数解析为 PMYDATA 类型
    PMYDATA MyData = (PMYDATA)lpParameter;
    // 打印参数内容
    printf("Thread %d is running...,val2 = %d\n", MyData->val1, MyData->val2);
    return 0;
}

int main(int argc, char* argv[])
{
    HANDLE hThreadArray[MAX_THREADS];       // 创建线程后返回的句柄
    PMYDATA pDataArray[MAX_THREADS];        // 给线程传递的参数数组
    DWORD dwThreadIdArray[MAX_THREADS];     // 储存线程唯一标识符(ThreadId)

    for (size_t i = 0; i < MAX_THREADS; i++)
    {
        // 初始化线程参数,在堆上分配内存,用来给线程传参
        pDataArray[i] = (PMYDATA)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, 
            sizeof(MYDATA));
        if (NULL == pDataArray[i])
        {
            printf("Alloc memory failed.");
            ExitProcess(2);
        }

        pDataArray[i]->val1 = i;
        pDataArray[i]->val2 = i + 100;

        // 创建线程
        hThreadArray[i] = CreateThread(
            NULL,
            0,
            _WorkerThread,
            pDataArray[i],
            0,
            &dwThreadIdArray[i]);

        // 判断线程是否创建成功
        if (NULL == hThreadArray[i])
        {
            printf("Create Thread Error!");
            ExitProcess(3);
        }
    }

    // 等待所有线程结束
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);

    // 释放资源
    for (size_t i = 0; i < MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
        if (NULL != pDataArray[i])
        {
            HeapFree(GetProcessHeap(), 0, pDataArray[i]);
            pDataArray[i] = NULL;
        }
    }

    return 0;
}

发表评论