c++,windows,多线程编程详细介绍

目录

  • [一、C++11 标准库 <thread> 实现多线程编程](#一、C++11 标准库 <thread> 实现多线程编程)
    • [1. 基本线程创建](#1. 基本线程创建)
    • [2. 线程管理](#2. 线程管理)
    • [3. 线程传参](#3. 线程传参)
    • [4. 同步机制](#4. 同步机制)
    • [5. 异步编程](#5. 异步编程)
  • [二、Windows API 实现多线程编程](#二、Windows API 实现多线程编程)
    • [1. 基本线程创建](#1. 基本线程创建)
    • [2. 线程管理](#2. 线程管理)
    • [3. 线程传参](#3. 线程传参)
  • 三、两种方法的对比

在 Windows 平台上使用 C++ 进行多线程编程,可以通过 C++11 标准库 或 Windows API 实现。以下是详细介绍:

一、C++11 标准库 实现多线程编程

1. 基本线程创建

  • 函数指针:通过函数指针创建线程,是最基本的方式。
  • Lambda 表达式:Lambda 表达式可以直接内联定义线程执行的代码。
  • 类成员函数:通过类中的 operator() 方法定义函数对象来创建线程,或直接调用类的成员函数。

2. 线程管理

  • join():等待线程完成执行。如果不调用 join() 或 detach() 而直接销毁线程对象,会导致程序崩溃。
  • detach():将线程与主线程分离,线程在后台独立运行,主线程不再等待它。

3. 线程传参

  • 值传递:参数可以通过值传递给线程。
  • 引用传递:如果需要传递引用参数,需要使用 std::ref。

4. 同步机制

  • 互斥量(std::mutex):用于保护共享数据,防止数据竞争。
  • 锁(std::lock_guard 和 std::unique_lock):用于管理锁的获取和释放。
  • 条件变量(std::condition_variable):用于线程间的条件变量,协调线程间的等待和通知。

5. 异步编程

std::async 和 std::future:用于实现线程间的值传递和任务同步,可以在不创建线程的情况下实现并发执行。

示例代码

cpp 复制代码
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
 
std::mutex mtx;
 
void printMessage(int id) {
    std::lock_guard<std::mutex> lock(mtx);
    std::cout << "Thread " << id << " is running.\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Thread " << id << " has finished.\n";
}
 
int main() {
    std::vector<std::thread> threads;
 
    for (int i = 0; i < 5; ++i) {
        threads.emplace_back(printMessage, i);
    }
 
    for (auto& thread : threads) {
        thread.join();
    }
 
    std::cout << "All threads have completed.\n";
    return 0;
}

二、Windows API 实现多线程编程

1. 基本线程创建

使用 CreateThread 函数创建线程,需要手动管理线程句柄和资源。

2. 线程管理

WaitForSingleObject 或 WaitForMultipleObjects:用于等待线程完成。

CloseHandle:用于关闭线程句柄,释放资源。

3. 线程传参

通过指针传递参数给线程函数。

示例代码

cpp 复制代码
#include <iostream>
#include <windows.h>
 
DWORD WINAPI ThreadFunction(LPVOID lpParam) {
    int id = *static_cast<int*>(lpParam);
    std::cout << "Thread " << id << " is running.\n";
    Sleep(1000); // Windows API 中的 Sleep 函数,单位为毫秒
    std::cout << "Thread " << id << " has finished.\n";
    return 0;
}
 
int main() {
    HANDLE threads[5];
    int threadIds[5] = {0, 1, 2, 3, 4};
 
    for (int i = 0; i < 5; ++i) {
        threads[i] = CreateThread(
            NULL,                   // 默认安全属性
            0,                      // 默认堆栈大小
            ThreadFunction,         // 线程函数
            &threadIds[i],          // 传递给线程函数的参数
            0,                      // 默认创建标志
            NULL                    // 线程ID(不返回)
        );
    }
 
    WaitForMultipleObjects(5, threads, TRUE, INFINITE); // 等待所有线程完成
 
    for (int i = 0; i < 5; ++i) {
        CloseHandle(threads[i]); // 关闭线程句柄
    }
 
    std::cout << "All threads have completed.\n";
    return 0;
}

三、两种方法的对比

C++11 :

优点:跨平台兼容性好,代码简洁,易于维护。

适用场景:需要跨平台支持的项目。

Windows API:

优点:提供更底层的控制,适合需要特定 Windows 功能的项目。

缺点:代码复杂,不跨平台。

适用场景:仅在 Windows 平台上运行的项目,且需要利用 Windows 特有的线程功能。

相关推荐
赵谨言24 分钟前
基于Python Web的大数据系统监控平台的设计与实现
大数据·开发语言·经验分享·python
专注前端30年29 分钟前
Vue2 中 v-if 与 v-show 深度对比及实战指南
开发语言·前端·vue
星竹晨L1 小时前
C++继承机制:面向对象编程的基石
开发语言·c++
G_dou_2 小时前
Rust安装
开发语言·后端·rust
9ilk2 小时前
【仿RabbitMQ的发布订阅式消息队列】--- 模块设计与划分
c++·笔记·分布式·后端·中间件·rabbitmq
恒者走天下2 小时前
面试的时候项目怎么聊,才能发挥最大的价值
c++
小白黑科技测评2 小时前
2025 年编程工具实测:零基础学习平台适配性全面解析!
java·开发语言·python
ejinxian3 小时前
Python 3.14 发布
java·开发语言·python
喜欢读源码的小白3 小时前
【Spring Boot + Spring Security】从入门到源码精通:藏经阁权限设计与过滤器链深度解析
java·开发语言·spring boot·spring security
NEU-UUN3 小时前
C语言 . 第二章第二节 . 分支结构
c语言·开发语言