Windows多线程 CreateThread()+结构体
目录
一、初衷
二、代码(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()+结构体相关推荐
- 【转】windows多线程CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...
- 从内存角度深入看结构体(window/linux)大小
今天我们来看一下windows(32, 64)(dev-c++,vc),linux(32, 64)不同系统下, 它们求结构体大小时,编译器到底给它们分配了哪些内存,又为什么这样分配,为啥子编译器给它们 ...
- C#:钩子、委托、匿名、事件、结构体转字节数组、多线程操纵控件、UDP
事件 C#事件分为几个步骤: 定义事件 定义处理函数 为事件添加处理函数 激活事件 事件被激活后自动调用处理函数. public event messagehandleer shenzhijiangl ...
- windows内核开发笔记七:内核开发OVERLAPPED结构体详解
windows内核开发笔记七:内核开发OVERLAPPED结构体详解 typedef struct _OVERLAPPED { DWORD Internal; DWORD InternalHi ...
- 结构体在多线程中用法
tcp在通信时,发送和接收都是多线程的,在这里,结构体的正确用法: struct SendStcuct { int size; int data_type; int cam_no; char send ...
- libevent 获取多线程结构体变量加锁方法
在看到http-server代码,获取多线程结构体对象的成员加锁方法 evutil_socket_t evconnlistener_get_fd(struct evconnlistener *le ...
- Windows进程与线程学习笔记(一)—— 进程结构体
Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...
- Windows API的时间结构体、时间转换及时间获取
Windows API的时间结构体.时间转换及时间获取 时间格式:DosDateTime <====>FileTime <====> SystemTime | ...
- 单线程写多线程读安全的结构体
大型网络游戏服务器的逻辑大多采用单线程设计,典型的就是一个线程处理一个区域(地图),跨区域通过跳转实现,这样,不同区域的对象在逻辑上是不发生交互的. 这样在一台服务器上开启N个线程就可以处理N个区域. ...
最新文章
- 2019年1月计算机书籍JavaScript新书
- oracle安装问题: 11g安装未填写hosts导致弹窗错误
- matlab 读取WAV文件
- s3c6410 ddr初始化
- 【lucene】lucene 分词 以及自定义分词器
- 基于JAVA+SpringMVC+Mybatis+MYSQL的软件办公管理系统
- 强一致、高可用、自动容灾能力背后,阿里X-Paxos的应用实践
- Linux文件系统之inode与软硬连接
- 7个免费的服务器监控工具
- python 移动平均函数_python – NumPy版本的“指数加权移动平均线...
- 如何快速查看颜色的RGB或者十六进制代码(QQ截图,最方便)
- c++编写乘法口诀表
- 如何写一封好的情书?Python三步爬取全网情诗信息
- [机缘参悟-72]:深度思考-人生自省的四重境界:不觉、自觉、觉他、圆满
- 如何制定提高客人满意度和客户忠诚度的客户参与策略
- 微信小程序全栈开发实践 第三章 微信小程序开发常用的API介绍及使用 -- 3.7 网络接口简介(七)学习EventChannel对象
- Fedora Project, extras 目录(进入小心)
- 医药行业大拼杀 小药药、药聚汇、朗致集团医药、同仁堂,模式对比
- 安装与使用 supervisor(可管理Tomcat进程)
- 期货开户亏损的一点原因
热门文章
- 质量云时代,WeTest品牌全面升级
- 操作系统期末总复习(2)——问答题【常考15道】
- 最完整的Springboot后台开发框架
- Micropython + ESP32 + TFT
- Linux下schedule模块下载,定时任务模块 schedule
- 平板上pyto软件_在安卓平板上利用随航功能——Twomon SE
- 我们总是先认识了身边的人,才认识了这个世界。
- android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置
- android获取进度条数值,android 进度条值的获取与显示/计时器
- MFC 进程操作-WinExec