Windows多线程编程 互斥量和临界区使用

Windows 多线程编程允许程序同时运行多个线程,提高程序的并发性和执行效率。多线程编程中的核心概念包括线程的创建、同步、调度、数据共享和竞争条件等。本文详细介绍了 Windows 多线程编程的关键技术点,并解释如何使用线程同步机制来保证线程安全。

1. 线程基础概念

1.1 线程

线程是操作系统能够独立调度的最小执行单元。一个进程可以包含多个线程,这些线程共享进程的地址空间和资源。多线程编程通过并发执行多个线程,提升程序性能,特别是在 I/O 操作、网络请求或图像处理等任务中。

1.2 进程 vs. 线程

进程:程序在操作系统中的运行实例。每个进程有独立的地址空间和资源。
线程:线程是进程中的轻量级执行单元,多个线程可以共享进程的内存和资源。一个进程至少包含一个主线程,可以派生出多个子线程。

2. 线程的创建与管理

在 Windows 中,创建和管理线程可以通过 WinAPI 提供的多种方法,其中常用的是 CreateThread 和 C++11 提供的标准库线程类。

2.1 使用 CreateThread

这是 WinAPI 中直接用于创建线程的函数,它返回一个线程句柄,用于管理线程。

#include <windows.h>
#include <iostream>

// 线程函数
DWORD WINAPI ThreadFunc(LPVOID lpParam) {
   
    for (int i = 0; i < 5; i++) {
   
        std::cout << "Thread running...\n";
        Sleep(1000); // 模拟工作,暂停1秒
    }
    return 0;
}

int main() {
   
    HANDLE hThread = CreateThread(
        NULL,            // 默认安全属性
        0,               // 默认堆栈大小
        ThreadFunc,      // 线程函数
        NULL,            // 参数传递给线程函数
        0,               // 默认创建标志
        NULL             // 可选的线程ID
    );

    if (hThread == NULL) {
   
        std::cout << "Error: Unable to create thread\n";
        return 1;
    }

    // 等待线程结束
    WaitForSingleObject(hThread, INFINITE);

    // 关闭线程句柄
    CloseHandle(hThread);

    return 0;
}

2.2 使用 C++11 std::thread

现代 C++ 提供了跨平台的 std::thread 类,用来简化线程的创建和管理。

#include <iostream>
#include <thread>

void ThreadFunc() {
   
    for (int i = 0; i < 5; i++) {
   
        std::cout << "Thread running...\n";
        std::this_thread::sleep_for(std::chrono::seconds(1));  // 模拟工作
    }
}

int main() {
   
    std::thread t(ThreadFunc);  // 创建线程
    t.join();  // 等待线程结束

    return 0;
}

3. 线程同步

在多线程程序中,多个线程可能会同时访问共享资源(如内存、文件等),如果不加以控制,可能会导致数据竞态条件(Race Condition)。线程同步用于协调线程对共享资源的访问,避免数据冲突。

  • 常用的同步机制包括:
临界区(Critical Section)
互斥量(Mutex)
信号量(Semaphore)
事件(Event)

3.1 临界区(Critical Section)

临界区是一种轻量级的同步机制,仅适用于单进程的线程同步。临界区在同一时间只允许一个线程进入,其他线程必须等待当前线程离开临界区后才能进入。

#include <windows.h>
#include <iostream>

CRITICAL_SECTION criticalSection;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑非不退

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值