目录

一、初衷

二、代码(C++)


一、初衷

网络上教程不够全面,要么只有CreateThread()的函数定义和简单实用方法,要么是有结构体输入但却不是多线程。

按照下面我写的代码,可以将既有结构体输入,又能执行多线程。

结构体输入的目的是:子线程函数ThreadFunction()输入有一定的讲究,而我们自己写的函数有很多参数输入,这时候可以将我们输入的参数组合起来作为结构体,再输入到ThreadFunction()函数中去。同时我们想要的输出也可以定义到结构体中。以下面代码为例,我们可以将结构体中的a作为输入,b作为输出。

二、代码(C++)

#include <stdio.h>
#include <windows.h>struct ThreadParameter {int a;int b;char user[10];char name[10];
};DWORD WINAPI ThreadFunction(LPVOID pParam) {ThreadParameter *tp = (ThreadParameter *)pParam; //强制转换参数char user[10];char pass[10];strcpy(user, tp->user);strcpy(pass, tp->name);printf("User = %s pass = %s \r\n", user, pass);Sleep(1000);tp->b = tp->a + 100;return 0;
}int main( )
{double start, end, cost;start = clock();  ThreadParameter tp1;strcpy(tp1.user, "qwe");strcpy(tp1.name, "12345");tp1.a = 1;ThreadParameter tp2;strcpy(tp2.user, "qwe2");strcpy(tp2.name, "a12345");tp2.a = 2;ThreadParameter tp3;strcpy(tp3.user, "qwe3");strcpy(tp3.name, "b12345");tp3.a = 3;HANDLE hThread[3];  hThread[0] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp1, 0, NULL);hThread[1] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp2, 0, NULL);hThread[2] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadFunction, &tp3, 0, NULL);end = clock();cost = (end - start) / 1000;printf("cost: %.2fs \n", cost);WaitForMultipleObjects(3, hThread, TRUE, INFINITE);for (int i = 0; i < 3; i++) {CloseHandle(hThread[i]); //关闭句柄}end = clock();cost = (end - start) / 1000;printf("cost: %.2fs \n", cost);printf("%d  %d  %d\n", tp1.b, tp2.b, tp3.b);system("pause");return 0;
}

输出结果:

说明:线程执行顺序可能是乱序的,但我们有WaitForMultipleObjects()函数,等待所有线程结束后再退出。我们在子线程函数ThreadFunction()中有睡眠1s的操作,执行了3个线程,但最终只花了1.02s,并且输出了我们想到的结果,由此可见他们确实是并行的。

参考文档:CreateThread创建线程传递结构体参数

CreateThread

Windows多线程 CreateThread()+结构体相关推荐

  1. 【转】windows多线程CreateThread与_beginthreadex本质区别

    本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...

  2. 从内存角度深入看结构体(window/linux)大小

    今天我们来看一下windows(32, 64)(dev-c++,vc),linux(32, 64)不同系统下, 它们求结构体大小时,编译器到底给它们分配了哪些内存,又为什么这样分配,为啥子编译器给它们 ...

  3. C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP

    事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...

  4. windows内核开发笔记七:内核开发OVERLAPPED结构体详解

    windows内核开发笔记七:内核开发OVERLAPPED结构体详解 typedef struct _OVERLAPPED {   DWORD Internal;   DWORD InternalHi ...

  5. 结构体在多线程中用法

    tcp在通信时,发送和接收都是多线程的,在这里,结构体的正确用法: struct SendStcuct { int size; int data_type; int cam_no; char send ...

  6. libevent 获取多线程结构体变量加锁方法

    在看到http-server代码,获取多线程结构体对象的成员加锁方法 evutil_socket_t   evconnlistener_get_fd(struct evconnlistener *le ...

  7. Windows进程与线程学习笔记(一)—— 进程结构体

    Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...

  8. Windows API的时间结构体、时间转换及时间获取

    Windows API的时间结构体.时间转换及时间获取   时间格式:DosDateTime <====>FileTime <====> SystemTime |        ...

  9. 单线程写多线程读安全的结构体

    大型网络游戏服务器的逻辑大多采用单线程设计,典型的就是一个线程处理一个区域(地图),跨区域通过跳转实现,这样,不同区域的对象在逻辑上是不发生交互的. 这样在一台服务器上开启N个线程就可以处理N个区域. ...

最新文章

  1. 2019年1月计算机书籍JavaScript新书
  2. oracle安装问题: 11g安装未填写hosts导致弹窗错误
  3. matlab 读取WAV文件
  4. s3c6410 ddr初始化
  5. 【lucene】lucene 分词 以及自定义分词器
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的软件办公管理系统
  7. 强一致、高可用、自动容灾能力背后,阿里X-Paxos的应用实践
  8. Linux文件系统之inode与软硬连接
  9. 7个免费的服务器监控工具
  10. python 移动平均函数_python – NumPy版本的“指数加权移动平均线...
  11. 如何快速查看颜色的RGB或者十六进制代码(QQ截图,最方便)
  12. c++编写乘法口诀表
  13. 如何写一封好的情书?Python三步爬取全网情诗信息
  14. [机缘参悟-72]:深度思考-人生自省的四重境界:不觉、自觉、觉他、圆满
  15. 如何制定提高客人满意度和客户忠诚度的客户参与策略
  16. 微信小程序全栈开发实践 第三章 微信小程序开发常用的API介绍及使用 -- 3.7 网络接口简介(七)学习EventChannel对象
  17. Fedora Project, extras 目录(进入小心)
  18. 医药行业大拼杀 小药药、药聚汇、朗致集团医药、同仁堂,模式对比
  19. 安装与使用 supervisor(可管理Tomcat进程)
  20. 期货开户亏损的一点原因

热门文章

  1. 质量云时代,WeTest品牌全面升级
  2. 操作系统期末总复习(2)——问答题【常考15道】
  3. 最完整的Springboot后台开发框架
  4. Micropython + ESP32 + TFT
  5. Linux下schedule模块下载,定时任务模块 schedule
  6. 平板上pyto软件_在安卓平板上利用随航功能——Twomon SE
  7. 我们总是先认识了身边的人,才认识了这个世界。
  8. android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置
  9. android获取进度条数值,android 进度条值的获取与显示/计时器
  10. MFC 进程操作-WinExec