windows系统编程1——线程和进程

article/2025/10/29 19:51:48

学习视频链接

03进程的创建_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Fd4y1G7Td?p=3&vd_source=0471cde1c644648fafd07b54e303c905

目录

一、创建线程

二、线程间同步

2.1  线程不同步的结果

2.2 原子操作上锁

2.3 临界区

2.4 内核对象

三、线程间通信

四、进程的创建

五、进程间通信

5.1 通信方式分类

5.2  共享内存的写法


一、创建线程

#include <iostream>
#include <windows.h>using namespace std;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp) 
{int i = 0;while (i < 10) {Sleep(200);i++;printf("SubThread: %d\n", i);}return 0;
}int main()
{//CreateThread(NULL, 0, ThreadProc, 0, 0, 0);                         // 创建,不开启线程HANDLE h = CreateThread(NULL, 0, ThreadProc, 0, CREATE_SUSPENDED, 0); // 创建,开启线程int i = 10;while (i < 20) {Sleep(200);i++;printf("ParentThread: %d\n", i);}ResumeThread(h);  // 开启线程Sleep(3000);return 0;
}

h 代表句柄

如果关闭两次线程就需要开启两次线程

二、线程间同步

2.1  线程不同步的结果

#include <iostream>
#include <windows.h>using namespace std;int g = 0;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp)
{for (int i = 0; i < 1000000; i++) {g++;}return 0;
}int main()
{HANDLE h = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);for (int i = 0; i < 1000000; i++) {g++;}WaitForSingleObject(h, INFINITE);  // 无限等待printf("%d\n", g);CloseHandle(h);  // 关闭线程return 0;
}

子线程和主线程可能同时写主线程,导致不能够达到预期的 2000000

2.2 原子操作上锁

#include <iostream>
#include <windows.h>using namespace std;unsigned int g = 0;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp) 
{for (int i = 0; i < 1000000; i++) {InterlockedIncrement(&g);}return 0;
}int main()
{HANDLE h = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);for (int i = 0; i < 1000000; i++) {InterlockedIncrement(&g);}WaitForSingleObject(h, INFINITE);  // 无限等待printf("%d\n", g);CloseHandle(h);  // 关闭线程return 0;
}

2.3 临界区

#include <iostream>
#include <windows.h>using namespace std;int g = 0;
CRITICAL_SECTION g_sec;  // 创建临界区对象// 回调函数
DWORD WINAPI ThreadProc(PVOID lp)
{for (int i = 0; i < 100000; i++) {EnterCriticalSection(&g_sec);  // 进入临界区g++;LeaveCriticalSection(&g_sec);}return 0;
}int main()
{// 初始化临界区对象InitializeCriticalSection(&g_sec);HANDLE h = CreateThread(0, 0, ThreadProc, 0, 0, 0);for (int i = 0; i < 100000; i++) {EnterCriticalSection(&g_sec);g++;LeaveCriticalSection(&g_sec);}WaitForSingleObject(h, INFINITE);           // 无限等待线程执行完printf("%d\n", g);// 句柄释放CloseHandle(h);return 0;
}

2.4 内核对象

1、内核对象

每一个内核对象在任何时候都处于两种状态之一:信号态和无信号态

线程在等待其中的一个或多个内核对象时,如果在等待的一个或多个内核对象处于无信号态,线程自身将被系统挂起,直到等待的内核对象变为有信号状态时,线程才恢复运行。常用的等待函数有 2 个

2、等待线程函数

在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用 Windows API 函数 WaitForSingleObject,或者 WaitForMultipleObjects。这两个函数都会等待 Object 被标为有信号时才返回的。这两个函数的优点是它们在等待的过程中会进入一个非常高效沉睡状态,只占用极少的 CPU 时间片

(1) 信号

#include <iostream>
#include <windows.h>using namespace std;int g = 0;
HANDLE hmutex;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp)
{for (int i = 0; i < 100000; i++) {WaitForSingleObject(hmutex, INFINITE);  // hmutex 有信号->无信号g++;ReleaseMutex(hmutex);                   // hmutex 无信号->有信号}return 0;
}int main()
{// 创建内核对象hmutex = CreateMutex(NULL, FALSE, NULL);   // hmutex 创建->有信号HANDLE h = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);for (int i = 0; i < 100000; i++) {WaitForSingleObject(hmutex, INFINITE);  // hmutex 有信号->无信号g++;ReleaseMutex(hmutex);                   // hmutex 无信号->有信号}WaitForSingleObject(h, INFINITE);           // 无限等待线程执行完printf("%d\n", g);// 释放内核释放CloseHandle(h);CloseHandle(hmutex);return 0;
}

(2) 事件

#include <iostream>
#include <windows.h>using namespace std;int g = 0;
HANDLE hEvent;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp)
{for (int i = 0; i < 100000; i++) {WaitForSingleObject(hEvent, INFINITE);  // hmutex 有事件->无事件g++;SetEvent(hEvent);                       // hmutex 无事件->有事件}return 0;
}int main()
{// 创建事件对象hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);HANDLE h = CreateThread(NULL, 0, ThreadProc, 0, 0, 0);for (int i = 0; i < 100000; i++) {WaitForSingleObject(hEvent, INFINITE);  // hmutex 有事件->无事件g++;SetEvent(hEvent);                       // hmutex 无事件->有事件}WaitForSingleObject(h, INFINITE);           // 无限等待线程执行完printf("%d\n", g);// 释放内核释放CloseHandle(h);CloseHandle(hEvent);return 0;
}

三、线程间通信

1、使用全局变量进行通信

2、参数传递方式

#include <iostream>
#include <windows.h>using namespace std;struct node {int age;int id;
};int g = 0;
HANDLE hEvent;// 回调函数
DWORD WINAPI ThreadProc(PVOID lp)
{node n = *(node*)lp;cout << n.age << " " << n.id << endl;;for (int i = 0; i < 100000; i++) {WaitForSingleObject(hEvent, INFINITE);  // hmutex 有事件->无事件g++;SetEvent(hEvent);                       // hmutex 无事件->有事件}return 0;
}int main()
{node n;n.id = 1;n.age = 10;// 创建事件对象hEvent = CreateEvent(NULL, FALSE, TRUE, NULL);HANDLE h = CreateThread(NULL, 0, ThreadProc, &n, 0, 0);for (int i = 0; i < 100000; i++) {WaitForSingleObject(hEvent, INFINITE);  // hmutex 有事件->无事件g++;SetEvent(hEvent);                       // hmutex 无事件->有事件}WaitForSingleObject(h, INFINITE);           // 无限等待线程执行完printf("%d\n", g);// 释放内核释放CloseHandle(h);CloseHandle(hEvent);return 0;
}

3、消息传递方式

MFC 里面的

四、进程的创建

#include <iostream>
#include <windows.h>using namespace std;int main()
{TCHAR commandLine[] = TEXT("C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe www.baidu.com");_STARTUPINFOW startInfo = { sizeof(_STARTUPINFOW)};_PROCESS_INFORMATION processInfo;/*BOOL CreateProcess(  LPCTSTR               lpApplicationName,   应用程序名称  LPTSTR                lpCommandLine,       命令行字符串  LPSECURITY_ATTRIBUTES lpProcessAttributes, 进程的安全属性  LPSECURITY_ATTRIBUTES lpThreadAttributes,  线程的安全属性  BOOL                  bInheritHandles,     是否继承父进程的属性  DWORD                 dwCreationFlags,     创建标志  LPVOID                lpEnvironment,       指向新的环境块(环境变量)的指针  LPCTSTR               lpCurrentDirectory,  指向当前目录名的指针  LPSTARTUPINFO         lpStartupInfo,       传递给新进程的信息  LPPROCESS_INFORMATION lpProcessInformation 新进程返回的信息  );*/bool ret = CreateProcess(NULL, commandLine, NULL, NULL, FALSE, 0, NULL, NULL, &startInfo, &processInfo);if (ret == false) {cout << "创建进程失败" << endl;return 0;}else {WaitForSingleObject(processInfo.hProcess, INFINITE);cout << "新创建的进程ID: " << processInfo.dwProcessId << endl;cout << "新创建的线程ID: " << processInfo.dwThreadId  << endl;CloseHandle(processInfo.hProcess);CloseHandle(processInfo.hThread);}return 0;
}

上述代码就完成了打开浏览器进程的任务了

 

五、进程间通信

5.1 通信方式分类

>套接字(socket):

套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

5.2  共享内存的写法

输出字符的程序

#include <iostream>
#include <windows.h>using namespace std;int main()
{/*HANDLE CreateFileMapping(HANDLE hFile,                       // 物理文件句柄LPSECURITY_ATTRIBUTES lpAttributes, // 安全设置DWORD flProtect,                    // 保护设置DWORD dwMaximumSizeHigh,            // 高位文件大小DWORD dwMaximumSizeLow,             // 低位文件大小LPCTSTR lpName                      // 共享内存名称);*/// 创建共享文件句柄HANDLE hMapFile = CreateFileMapping(NULL, NULL, PAGE_READWRITE, 0, 1024, TEXT("fileMap"));char *buf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);gets_s(buf, 100);while (1) {Sleep(1000);}UnmapViewOfFile(buf);CloseHandle(hMapFile);return 0;
}

接收字符的程序

#include <iostream>
#include <windows.h>using namespace std;int main()
{/*HANDLE CreateFileMapping(HANDLE hFile,                       // 物理文件句柄LPSECURITY_ATTRIBUTES lpAttributes, // 安全设置DWORD flProtect,                    // 保护设置DWORD dwMaximumSizeHigh,            // 高位文件大小DWORD dwMaximumSizeLow,             // 低位文件大小LPCTSTR lpName                      // 共享内存名称);*/// 创建共享文件句柄HANDLE hMapFile = CreateFileMapping(NULL, NULL, PAGE_READWRITE, 0, 1024, TEXT("fileMap"));char *buf = (char*)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 1024);cout << buf << endl;getchar();UnmapViewOfFile(buf);CloseHandle(hMapFile);return 0;
}


http://chatgpt.dhexx.cn/article/GHlQlM3M.shtml

相关文章

day01 windows编程入门

文章目录 window编程基本概念Windows常见的数据类型字符串的处理 第一个windows程序的编写 window编程基本概念 Windows编程的本质就是使用好操作系统&#xff0c;想要用好操作系统必不可少的秘籍----MSDN。 Windows编程主要分为两种&#xff1a; 1、控制台编程(CUI) 2、图形界…

10行代码带你入门Windows编程

Windows编程——Hello World 开发工具效果展示源代码主函数主函数参数HINSTANCEhInstanccehPreInstanceLPSTRlpCmdLinenCmdShowMessageBox 小知识 开发工具 Visual Studio 2013 效果展示 源代码 #include <Windows.h> //头文件//主函数 int WINAPI WinMain(HINSTANC…

使用VS Code进行Qt开发

使用VS Code进行Qt开发 文章目录 使用VS Code进行Qt开发测试环境步骤1. 将Qt的bin目录添加到环境变量2. 安装VS Code扩展3. 使用Qt Creator创建CMake项目4. 在VS Code中打开项目5. 构建并运行项目7. 调试项目 一些小问题 Qt Creator界面不美观&#xff0c;而VS Code更漂亮一些。…

Qt开发CAN通信的环境配置

Qt开发CAN通信的环境配置 目录 1 开发环境 1 1.1 编程环境 1 1.2 工程设置 1 1.3 调试窗口设置 2 1.4 依赖库 2 1.5 源代码的适配 3 2 运行及硬件环境 3 2.1 CAN设备 3 2.4 运行支持文件 3 3 故障解决 4 3.1 转到槽函数失败 4 1 开发环境 1.1 编程环境 工程采用Windows系统下的…

Qt开发必备技术栈学习路线和资料

简介 本文为&#xff1a;C QT 学习路线大纲资料&#xff08;文章底部&#xff09; Qt 可以做什么&#xff1f; Qt 虽然经常被当做一个 GUI 库&#xff0c;用来开发图形界面应用程序&#xff0c;但这并不是 Qt 的全部&#xff1b;Qt 除了可以绘制漂亮的界面&#xff08;包括控…

WIndows下搭建Qt开发环境 -- Qt 、Qt Creater 安装、配置

[本文发布于https://blog.csdn.net/Stack_/article/details/122491885&#xff0c;未经许可不得转载&#xff0c;转载须注明出处] 一、需要下载安装哪些文件 1Qt SDK&#xff0c;即Qt官方提供的API2编辑器、UI设计器 – Qt Creater3编译器 其中Qt Creater是可以被Visual Studi…

Qt开发MQTT(一) 之Qt官方Qt MQTT

概述 Qt开发MQTT程序有两种方式&#xff0c;一个是Qt官方提供的基于MQTT的封装&#xff0c;一个是第三方&#xff08;EMQ&#xff09;开发的用于Qt调用MQTT的接口&#xff0c;二者使用方法大同小异&#xff0c;并且均提供了源码。那么&#xff0c;这里先来介绍第一种&#xff…

Qt开发之Rust篇(一)

本文运行环境&#xff1a; 操作系统&#xff1a;Windows 11 专业版Visual Studio版本&#xff1a;Visual Studio 2022 PreviewQt版本&#xff1a;Qt 5.14.2 1、安装C编译器 除了 Rust 自己的构建工具之外&#xff0c;您还需要设置 C 编译器、Qt 和 CMake。 在 Windows 上&am…

【Qt】ubuntu下Qt开发环境的搭建

下载对应版本的Qt开发环境 Qt官网下载地址&#xff1a;https://download.qt.io 国内镜像下载地址&#xff1a;https://mirrors.cloud.tencent.com/qt/ 。建议用镜像下载速度快。集成安装包在 official_releases/qt 目录下&#xff0c;新地址&#xff1a;https://download.q…

QT开发环境简介、安装以及搭建VS2019环境

文章目录 1、QT简介2、 QT的安装1、下载QT安装包2、安装QT1、安装qt creator2、设置qt账号3、选择安装路径4、选择组件5、同意许可协议&#xff0c;下一步6、菜单快捷方式7、点击安装&#xff0c;等待安装完成8、安装完成 3、qt creator创建工程1、打开软件2、新建项目3、选择Q…

Qt开发框架介绍

Qt: 基于C++跨平台的软件开发框架 Languages: C++, Python, Qt QML, Javascript Qt支持的平台有:Windows, Linux, macOS Qt Quick技术: 描述性UI设计语言(QML)作为前端, C++作为后端. 适用于基于触摸操作的界面的开发, 轻松实现优美、现代的界面. 默认使用GPU进行图形渲染.…

用QT开发安卓应用

QT官网参考链接 https://doc.qt.io/qt-5/android.html 这里的指示是QT5的&#xff0c;和QT6有点不同。 安装QT 下载地址QT6&#xff1a;http://download.qt.io/archive/qt/6.0/6.0.0/single/ 安装后&#xff0c;会多出一个Qt文件夹&#xff0c;里边包含了Qt Creator.app和…

【QT基础入门】1、QT开发环境搭建

文章目录 一、学习所需要的软件 二、安装 VS2012 三、win10 下安装 QT 一、学习所需要的软件 Visual Studio 2012Qt SDK 4.7.4Qt Creator 2.4.1 Visutal Studio 2012 用于学习 Windows 上 GUI 程序设计的原理体会使用 C/C 编写 GUI 窗口应用程序展现 Qt 对于 Windows 窗口开…

UOS搭建QT开发环境

需要注意的是&#xff0c;UOS与其他ubantu系统不同&#xff0c;UOS本身是基于QT开发的&#xff0c;所以当安装的QT版本高于UOS开发者使用的版本时&#xff0c;在使用过程中会出现各种问题。 以下以 UOS家庭版&#xff08;系统环境搭建参考本人上一篇博客 搭建国产化统信UOS操作…

VS2019 Qt开发环境搭建与配置

目录 更新说明 学习Qt、安装Qt环境的困扰 问题1&#xff1a;该选什么操作系统&#xff0c;该用MinGW还是msvc ? 问题2&#xff1a;如果用visual studio该安装哪个qt版本&#xff1f; 问题3&#xff1a;Qt开发商业软件需要付费授权吗&#xff1f; Visual studio Qt 安装步骤…

安装QT开发环境

UOS操作系统 1. 开启开发者权限。 开启开发者权限后可以使用root权限。 2. 先获取可更新的软件执行 sudo apt-get update 3. 安装所有可更新的软件 sudo apt-get dist-upgrade 4. 安装所有依赖的环境包 一下命令为了方便可以写入脚本中执行脚本运行更加方便。一下除了安…

Qt开发Android环境配置

目录 0.前提 1.安装JDK 2.Android SDK下载 3. 安装模拟器 4.Qt中进行配置 5.新建android项目 6.结束 0.前提 安装Qt时勾选Android相关套件&#xff0c;确保Qt的安装组件已被安装。 1.安装JDK Java Downloads | Oracle 安装java8即可&#xff0c;需要登陆&#xff0c;没…

08_树莓派安装Qt开发环境

目的&#xff1a; 通过本章节&#xff0c;在树莓派上安装Qt开发环境。 目录 1、Qt简介 2、安装Qt开发环境 2.1、安装指令 2.2、示例demo 2.2.1、打开Qt Creator工具 2.2.2、新建工程 2.2.3、添加hello标签 2.2.4、编译运行工程代码 2.2.5、运行结果 1、Qt简介 Qt 是一个…

Qt 开发环境搭建

一、Qt下载与安装 1、qt下载网站https://download.qt.io/ 其中各个目录含义如下&#xff1a; 目录说明snapshots/预览版&#xff0c;最新开发测试的Qt库和开发工具online/在线安装源official_releases/正式发布版&#xff0c;是与开发版相对应的稳定版Qt库和开发工具&#x…

VS中使用Qt开发项目

文章目录 请添加图片描述 前言一、Qt和VS版本的选择和安装&#xff08;一&#xff09;Qt版本的选择和安装&#xff08;二&#xff09;VS版本的选择及安装 二、VS与Qt的连接&#xff08;一&#xff09;安装插件&#xff08;二&#xff09;Qt路径配置&#xff08;三&#xff09;测…