Win32之创建线程
0x01.什么是线程?
1、线程是附属在进程上的执行实体,是代码的执行流程
进程 本身是空间上的概念,代表4GB的虚拟内存,线程代表着时间概念,也就是说,线程是当前运行的代码
在某个时间点只能有一段代码执行,但是cpu切换的快,所以看着像同时运行,这是单核的,所以单核的情况下并不是真正的多线程
因为线程执行的话是需要一套寄存器的,比如eax,ecx,ebx...
2、一个进程可以保护多个线程,但一个进程至少要包含一个线程

我们现在想创建一个线程了,其实main函数这边就是一个线程了,但是我们需要再创建一个呢?
需要使用到新的api,CreateThread
0x02. 创建线程
CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全描述符,判断子进程是否可以继续父进程的句柄表,NULL就可以了
IZE_T dwStackSize, //初始堆栈,如果不填写就会自动填写默认的
LPTHREAD_START_ROUTINE lpStartAddress, //当前的线程要执行的代码
__drv_aliasesMem LPVOID lpParameter, //要创建的线程的参数,这是个指针
DWORD dwCreationFlags, //创建线程的标识
LPDWORD lpThreadId //这个是OUT类型参数,这个参数说明是往外传递结果的,这个就是返回创建的线程ID,返回值是当前线程的句柄
);
dwCreationFlags标识:


由于是返回值是句柄,所以我们要声明一个句柄变量进行接收,也可以不接收
CloseHandle()不想用的话可以用这个函数关闭,但是这里的关闭其实是减掉一个计数器
线程的内核对象计数器为0也不会关闭,关闭线程的两个必要条件
①、线程的内核对象计数器为 0
②、线程的执行代码执行完毕了
#include <stdio.h>
#include <windows.h>
int main()
{
HANDLE hThread = CreateThread(NULL, 0, 0, NULL, 0, NULL);
CloseHandle(hThread);
for (int i = 0; i < 100; i++)
{
Sleep(500);
printf("------- %d --------\n", i);
}
getchar();
return 0;
}
所以我们这边CloseHandle掉线程也是没有影响的,并不会影响到线程,因为当前代码没执行完后是没有人能关掉的
然后看向CreateThread的第三个参数:lpStartAddress
而这个参数是要执行的代码,然而这个代码是不能随便乱写的,是有格式的

#include <stdio.h>
#include <windows.h>
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
return 0;
}
int main()
{
HANDLE hThread = CreateThread(NULL, 0, 0, NULL, 0, NULL);
CloseHandle(hThread);
for (int i = 0; i < 100; i++)
{
Sleep(500);
printf("------- %d --------\n", i);
}
getchar();
return 0;
}
然后我们在这个ThreadProc函数中写上代码,我们依然写入for循环来

然后基本就类似是同时运行的,所以以后每创建一个线程就必须要使用 CreateThread函数来
这个函数就是告诉代码在哪里,返回值啥的就需要强转就可以了
这时候我们想指定线程循环的次数呢?
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
int* p = (int*)lpParameter;
for (int i = 0; i < *p; i++)
{
Sleep(500);
printf("++++++++++++++ %d \n", i);
}
return 0;
}
在ThreadProc() 函数内小改动一下,main函数中指定一下要几次
int main()
{
int n;
n = 10;
HANDLE hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID)&n, 0, NULL);
CloseHandle(hThread);
for (int i = 0; i < 100; i++)
{
Sleep(500);
printf("------- %d \n", i);
}
getchar();
return 0;
}
线程参数可以传任何参数,传进去后转型一下就好了,然后运行一下,发现成功了

Win32之创建线程的更多相关文章
- c++ Pthread创建线程后必须使用join或detach释放线程资源
http://www.cppblog.com/prayer/archive/2012/04/23/172427.html 这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthre ...
- 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)
在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...
- 0036 Java学习笔记-多线程-创建线程的三种方式
创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...
- [笔记]linux下和windows下的 创建线程函数
linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- python:threading多线程模块-创建线程
创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...
- 【java并发】传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- Java并发编程:如何创建线程?
Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...
- 驱动开发之 创建线程函数PsCreateSystemThread
PsCreateSystemThread 创建一个执行在内核模式的系统线程. 注意:创建线程必须用函数PsTerminateSystemThread强制线程结束.否则该线程是无法自动退出的. 函数原型 ...
随机推荐
- 正则表达式基础(Regular Expression)
正则表达式简介 n 为什么需要正则表达式? q 文本的复杂处理. n 正则表达式的优势和用途? q 一种强大而灵活的文本处理工具: q 提供了一种紧凑的.动态的方式,能够以一种完全通用的方式 ...
- MySQL分区 (分区介绍与实际使用)
分区介绍: 一.什么是分区? 所谓分区,就是将一个表分成多个区块进行操作和保存,从而降低每次操作的数据,提高性能.而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组 ...
- 吴恩达Machine Learning学习笔记(二)--多变量线性回归
回归任务 多变量线性回归 公式 h为假设,theta为模型参数(代表了特征的权重),x为特征的值 参数更新 梯度下降算法 影响梯度下降算法的因素 (1)加速梯度下降:通过让每一个输入值大致在相同的范围 ...
- 曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)
前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了. 但是,内部的 ...
- 高并发场景-请求合并(一)SpringCloud中Hystrix请求合并
背景 在互联网的高并发场景下,请求会非常多,但是数据库连接池比较少,或者说需要减少CPU压力,减少处理逻辑的,需要把单个查询,用某些手段,改为批量查询多个后返回. 如:支付宝中,查询"个人信 ...
- 小白也能看懂的ArrayList的扩容机制
来,话不多说进入正题!我们下面用最简单的代码创建ArrayList并添加11个元素,并 一 一 讲解底层源码:在说之前,给大家先普及一些小知识: >ArrayList底层是用数组来实现的 > ...
- 用于ASP.net的MVC模块
下载MVCBricks_SRC - 492.58 KB 表的内容 介绍系统要求游戏闪屏的最终考虑历史 介绍 自从我写上一篇关于ASP的文章以来,已经有很长时间了.净的话题.这次我决定写一些关于它的东西 ...
- ASP。NET控件—控件如何相互关联
介绍 这是我关于ASP系列的另一篇小文章.NET控件,它的主要焦点是揭示控件如何相互关联,涉及哪些实体,以及它们在此任务中的主要角色是什么. 动机 理解每次处理页面请求和某人在他的浏览器中获得您的we ...
- (九) SpringBoot起飞之路-整合/集成Swagger 2 And 3
兴趣的朋友可以去了解一下其他几篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Spri ...
- 腾讯云服务器,使用xshell ssh秘钥登录的时候报错:所选的用户密钥未在远程主机上注册
1.背景 新买了台腾讯云服务器,在腾讯云控制台新建了SSH私钥,然后下载到本地. 在本地使用xshell工具,导入下载好的私钥进行登录,报错:所选的用户密钥未在远程主机上注册 2.解决方案 在确定选择 ...