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强制线程结束.否则该线程是无法自动退出的. 函数原型 ...
随机推荐
- Oracle学习(十六)Oracle安装
为了本地创建数据库自己玩耍,还是下个Oracle的客户端吧... 一.下载地址 注意,要用Oracle的帐号进行登录后才能下载 http://download.oracle.com/otn/nt/or ...
- 如何使用NuGet package .nupkg文件?
如果你本来就有.nupkg文件并且你只需要.dll文件的话,你可以通过打开.zip下的lib文件夹来获取. 例如:
- 普转提Day2
T1 给定一个区间,求这个区间中只有一个数字与其他数组不相同的数的个数. 给出的区间范围较大,但是要求的数比较少.所以我的想法是这样的:因为这些数只有一个数字和每个数字都相同的数不同,所以考虑将所有数 ...
- thinkphp上传图片,生成缩略图
Image.php <?php /** * 实现图片上传,图片缩小, 增加水印 * 需要定义以下常量 * define('ERR_INVALID_IMAGE', 1); * define('ER ...
- websocket+sockjs+stompjs详解及实例
最近有项目需求要用到websocket,刚开始以为很简单,但是随着遇到问题,深入了解,才知道websocket并不是想象中的那么简单,这篇文章主要是考虑websocket在客户端的使用. 1.http ...
- linux中重启网卡后网络不通(NetworkManager篇)
1.问题描述 RHEL7.6系统,使用nmcli绑定双网卡后,在使用以下命令重启network服务后主机网络异常,导致无法通过ssh远程登录系统. systemctl restart network ...
- TIMESTAMP with implicit DEFAULT value is deprecated
出错版本 mysql 5.7 why? (警告)不包含隐式默认值的时间戳 way? 在 /etc/my.conf中 mysqld 模块中添加 explicit_defaults_for_timesta ...
- 搭建实用深度学习环境(Ubuntu16.10+Theano0.8.2+Tensorflow0.11.0rc1+Keras1.1.0)
在动手安装之前,首先要确定硬件,系统,准备安装软件的版本,确定这些软硬件之间是否相互支持或兼容.本文安装的主要环境和软件如下: Ubuntu16.10+CUDA8.0(cudnn5.1,CNMEM)+ ...
- SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录
SFUD+FAL+EasyFlash典型场景需求分析:用整个flash存储数据,上千条数据,读取得时候用easyflash很慢,估计要检索整个flash太慢了. 改进方法:分区检索. 1存数据时,根据 ...
- 面试官:开发过Maven插件吗?我:开发过啊。。。
写在前面 转眼间,今天已经是假期的第4天了.今天要给大家分享点啥呢?想了半天,想起了之前去某宝面试的情景.记得面试前自己基于Maven开发过一些简单实用的插件,而且在自己的本地环境中一直在使用,极大的 ...