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之创建线程的更多相关文章

  1. c++ Pthread创建线程后必须使用join或detach释放线程资源

    http://www.cppblog.com/prayer/archive/2012/04/23/172427.html 这两天在看Pthread 资料的时候,无意中看到这样一句话(man pthre ...

  2. 在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程!(更好的管理异常)

    在Delphi中创建线程,请一定使用BeginThread()代替CreateThread()创建线程! 如果直接使用Win32的API函数CreateThread()创建多个线程,也是可以创建的.但 ...

  3. 0036 Java学习笔记-多线程-创建线程的三种方式

    创建线程 创建线程的三种方式: 继承java.lang.Thread 实现java.lang.Runnable接口 实现java.util.concurrent.Callable接口 所有的线程对象都 ...

  4. [笔记]linux下和windows下的 创建线程函数

    linux下和windows下的 创建线程函数 #ifdef __GNUC__ //Linux #include <pthread.h> #define CreateThreadEx(ti ...

  5. Java学习笔记-多线程-创建线程的方式

    创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...

  6. python:threading多线程模块-创建线程

    创建线程的两种方法: 1,直接调用threading.Thread来构造thread对象,Thread的参数如下: class threading.Thread(group=None, target= ...

  7. 【java并发】传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  8. Java并发编程:如何创建线程?

    Java并发编程:如何创建线程? 在前面一篇文章中已经讲述了在进程和线程的由来,今天就来讲一下在Java中如何创建线程,让线程去执行一个子任务.下面先讲述一下Java中的应用程序和进程相关的概念知识, ...

  9. 驱动开发之 创建线程函数PsCreateSystemThread

    PsCreateSystemThread 创建一个执行在内核模式的系统线程. 注意:创建线程必须用函数PsTerminateSystemThread强制线程结束.否则该线程是无法自动退出的. 函数原型 ...

随机推荐

  1. JUC并发编程--AQS

    转自: https://www.jianshu.com/p/d8eeb31bee5c 前言 在java.util.concurrent.locks包中有很多Lock的实现类,常用的有Reentrant ...

  2. 井字棋小游戏(C语言)

    最近沉迷于<NetHack>.<DCSS>等字符游戏,对其很感兴趣,于是用C语言写了个字符界面的井字棋小游戏.欢迎大家指教. 编写时遇到了一些问题,我原先准备用循环,直到读取到 ...

  3. CSP-J 2019复赛分析

    [CSP-J 2019 ]复赛分析 前言(????) 总的来说,这次复赛感觉考的很不满意,至于原因,感慨万分!关键是:期中考试了!偏偏是这个时候! - 由于我是一个初二的蒟蒻,所以考试前先定了一个目标 ...

  4. 02 ArcPython的使用大纲

    一.什么情况下使用ArcPython? 1.现有工具实现不了,可以用python 2.流程化需要时,可以使用python 3.没有AE等二次开发环境 4.其他特殊场景 二.ArcPython在ArcG ...

  5. Arduino Wire.h(IIC/ I2C)语法

    转自:https://www.cnblogs.com/1996jiwei/p/6561681.html 本文转自上面链接,版权请直接参考原链接. 最近在用I2C进行通信交流,发现有两种方法的头文件需要 ...

  6. The comparison between object and constructor

    1.相似的地方 1.举个栗子:public struct Student{    string name;    int age;}public class bike{    int weight;  ...

  7. CRUD,分页,排序,搜索与AngularJS在MVC

    下载source - 53.1 MB 介绍 在选择最新的技术时,有几个因素会起作用,包括这些技术将如何与我们的项目集成.这篇文章解决了开始使用AngularJS和MVC的乞丐的问题.这篇文章告诉使用语 ...

  8. vue : 无法加载文件 C:\Users\Lenovo\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。

    第一步:用管理员身份打开 第二步:执行:set-ExecutionPolicy RemoteSigned 选择Y或A,回车

  9. nginx完美支持thinkphp3.2.2(需配置URL_MODE=>3 rewrite兼容模式)

    来源:http://www.thinkphp.cn/topic/26637.html 环境:nginx 1.6,thinkphp3.2.2 第一步,修改server块 server { listen ...

  10. ansible-playbook流程控制-when条件判断

    1. ansible-playbook添加判断     when相当于shell脚本里的if 判断,when语句就是用来实现这个功能的,它是一个jinja2的语法,但是不需要双大括号,用法很简单  1 ...