win32多线程: 线程创建与结束等待
#include<Windows.h>
#include<iostream> using namespace std; /*1、在启动一个线程之前,必须为线程编写一个全局的线程函数,
* 这个线程函数接受一个32位的LPVOID(没有类型的指针)作为参数,返回一个DWORD
*这里建了两个全局的线程函数ThreadFuncFirst,ThreadFuncSecond*/
DWORD WINAPI ThreadFuncFirst(LPVOID param) { //DWORD:32位无符号整型数据(DWORD32), VOID:无类型,相当于标准C语言中的void,LPVOID无类型指针
int iCount = ;
//2、 在线程处理代码部分通常包括一个死循环,该循环中先等待某事情的发生,再处理相关的工作
while (iCount--) {
cout << "ThreadFuncFirst:" << iCount<<endl;
}
return ;
} DWORD WINAPI ThreadFuncSecond(LPVOID param)
{
int iCount = ;
while (iCount--) {
cout << "ThreadFuncSecond:" << iCount<<endl;
}
return ;
} int main() {
DWORD dwThreadID = ;
//3、创建两个线程handleFirst,handleSecond,返回窗口的句柄HANDLE
HANDLE handleFirst = CreateThread(NULL, , ThreadFuncFirst, , , &dwThreadID);
if (!handleFirst)
{
cout << "create thread 1 error:" << endl;
}
HANDLE handleSecond = CreateThread(NULL, , ThreadFuncSecond, , , &dwThreadID);
if (!handleSecond)
{
cout << "create thread 2 error:" << endl;
} //HANDLE arrayHandle[] = {handleFirst, handleSecond};
//WaitForMultipleObjects(2, arrayHandle, TRUE, INFINITE); //4、等待线程返回,用sleep()就太LOW了
WaitForSingleObject(handleFirst, INFINITE);
WaitForSingleObject(handleSecond, INFINITE);
CloseHandle(handleFirst);//句柄默认值2 这里减1,线程函数执行完后释放资源。
CloseHandle(handleSecond); return ;
}
建议开始之前详细阅读和理解我转发的《多线程学习:win32多线程编程基本概念》https://www.cnblogs.com/chaoyingLi/p/11236070.html
附注:CreateThread()函数原型:
CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ SIZE_T dwStackSize,
_In_ LPTHREAD_START_ROUTINE lpStartAddress,
_In_opt_ __drv_aliasesMem LPVOID lpParameter,
_In_ DWORD dwCreationFlags,
_Out_opt_ LPDWORD lpThreadId
);
第一个参数是指向LPSECURITY_ATTRIBUTES型态的结构的指针。在Windows 98中忽略该参数。在Windows NT中,它被设为NULL。
第二个参数是用于新线程的初始堆栈大小,默认值为0。在任何情况下,Windows根据需要动态延长堆栈的大小。
第三个参数是指向线程函数的指标。函数名称没有限制,但是必须以下列形式声明:
DWORD WINAPI ThreadProc (PVOID pParam) ;
第四个参数为传递给ThreadProc的参数。这样主线程和从属线程就可以共享数据。
第五个参数通常为0,但当建立的线程不马上执行时为旗标CREATE_SUSPENDED。线程将暂停直到呼叫ResumeThread来恢复线程的执行为止。
第六个参数是一个指标,指向接受执行绪ID值的变量。
建一个新线程,大致做如下步骤:
1在内核对象中分配一个线程标识/句柄,可供管理,由CreateThread返回
2把线程退出码置为STILL_ACTIVE,把线程挂起计数置1
3分配context结构
4分配两页的物理存储以准备栈,保护页设置为PAGE_READWRITE,第2页设为PAGE_GUARD
5lpStartAddr和lpvThread值被放在栈顶,使它们成为传送给StartOfThread的参数
6把context结构的栈指针指向栈顶(第5步)指令指针指向startOfThread函数
win32多线程: 线程创建与结束等待的更多相关文章
- win32多线程 (一) 线程创建与结束等待
#include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...
- Win32 多线程的创建方法和基本使用
Win32多线程的创建方法主要有: (1)CreateThread() (2)_beginthread()&&_beginthreadex() (3)AfxBeginThread() ...
- java多线程-线程创建
Java 线程类也是一个 object 类,它的实例都继承自 java.lang.Thread 或其子类. 可以用如下方式用 java 中创建一个线程,执行该线程可以调用该线程的 start()方法: ...
- 线程创建,属性设置与获得,等待线程结束,线程中fork,以及执行exec()
这篇博客的形式我想以分析代码不同情况为主: 点击(此处)折叠或打开 #include<stdio.h> #include<pthread.h> #include<time ...
- Win32多线程编程(2) — 线程控制
Win32线程控制只有是围绕线程这一内核对象的创建.挂起.恢复.终结以及通信等操作,这些操作都依赖于Win32操作系统提供的一组API和具体编译器的C运行时库函数.本篇围绕这些操作接口介绍在Windo ...
- Win32多线程编程(3) — 线程同步与通信
一.线程间数据通信 系统从进程的地址空间中分配内存给线程栈使用.新线程与创建它的线程在相同的进程上下文中运行.因此,新线程可以访问进程内核对象的所有句柄.进程中的所有内存以及同一个进程中其他所有线 ...
- Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)
线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...
- Python多线程的创建,相关函数和守护线程的理解
一:多线程的创建 threading库创建线程有两种方式,函数式和继承式 1)函数式 def func(): print 'Starting' print 'Ending' t=threadin ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
随机推荐
- 阿里云Ubuntu安装LNMP环境之Mysql
在QQ群很多朋友问阿里云服务器怎么安装LNMP环境,怎么把项目放到服务器上面去,在这里,我就从头开始教大家怎么在阿里云服务器安装LNMP环境. 在这之前,我们先要知道什么是LNMP. L: 表示的是L ...
- ios端,input框,汉字输入不上问题
input{ -webkit-transform: translate3d(, , ); } 在input框上加上这段代码就可以了 另外,我在一个页面上,用一个开关去控制一部分内容显示隐藏与显示时,当 ...
- Java程序基本结构
/** * 可以用来自动创建文档的注释 */ public class Hello { public static void main(String[] args) { // 向屏幕输出文本: Sys ...
- java线程之sleep
翻译:https://www.journaldev.com/1020/thread-sleep-java 简述 Thread .sleep()方法用来暂停当前线程的执行,以毫秒为单位.还有另一个重载方 ...
- ANDROID_ID
在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是ANDROID_ID,当设备被wipe后该值会被重置.可以通过下面的方法获取: i ...
- Linux服务器操作
Linux关于服务器的操作(root权限) 1. 查看服务器版本信息 cat /etc/redhat-release 2.将Windows上文件通过xshell传到Linux服务器 查找系统自带软件包 ...
- chattr +i 锁定文件
reboot machine, 查看DNS服务器配置文件\etc\resolv.conf, 里面的内容变回原来的样子. 原因是resolv.conf文件被系统程序自动维护.为了防止该文件被跟改,可以为 ...
- LC 275. H-Index II
Given an array of citations sorted in ascending order (each citation is a non-negative integer) of a ...
- Python新利器之pipenv
前言 之前学习异步asyncio库的时候,因为asyncio库支持Python3.5以上的版本,而我的Ubuntu14.04只有Python3.4,虽然下载了Python3.6,但是想直接利用ipyt ...
- [CDH] Cloudera's Distribution including Apache Hadoop
You may choose to install spark, yarn, hive, etc one by one. [Spark] 00 - Install Hadoop & Spark ...