前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个简单的 Windows 下多线程创建 Demo

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

作者头像
我与梦想有个约会
发布2023-10-21 14:14:29
1610
发布2023-10-21 14:14:29
举报
文章被收录于专栏:jiajia_deng

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

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

运行效果

2016-02-11_212502
2016-02-11_212502

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

程序代码

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-02-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行效果
  • 程序代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档