C++中的多线程用法

        在日常的开发中,遇到一些耗时操作不可避免的需要开启一个子线程来完成任务。windows平台下使用C++中创建多线程的常用方法有如下几种

1、使用CreateThread函数

这是最直接的方法,使用Windows API函数CreateThread来创建一个新的线程。

#include <windows.h>

DWORD WINAPI ThreadFunction(LPVOID lpParam) {
    // 线程要执行的代码
    return 0;
}

int main() {
    // 创建线程
    HANDLE hThread = CreateThread(
        NULL,          // 安全属性
        0,             // 初始堆栈大小
        ThreadFunction, // 线程函数
        NULL,          // 线程函数参数
        0,             // 线程创建标志
        NULL);         // 线程标识符

    if (hThread == NULL) {
        // 错误处理
    }

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

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

    return 0;
}

2、使用使用_beginthreadex_endthreadex函数

        这是C运行时库提供的函数,用于创建线程。_beginthreadex创建线程,_endthreadex用于结束线程。

#include <process.h>

unsigned int __stdcall ThreadFunction(void* lpParam) {
    // 线程要执行的代码
    _endthreadex(0); // 线程结束
    return 0;
}

int main() {
    unsigned int threadID;
    HANDLE hThread = (HANDLE)_beginthreadex(
        NULL,          // 安全属性
        0,             // 初始堆栈大小
        ThreadFunction, // 线程函数
        NULL,          // 线程函数参数
        0,             // 线程创建标志
        &threadID);    // 线程标识符

    if (hThread == 0) {
        // 错误处理
    }

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

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

    return 0;
}

3、使用C++11的<thread>

        C++11标准引入了线程库,提供了一种更现代和C++风格的方式来创建和管理线程。

#include <iostream>
#include <thread>

void ThreadFunction() {
    // 线程要执行的代码
    std::cout << "Hello from the thread!" << std::endl;
}

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

    return 0;
}

4、使用std::async

 std::async不仅可以用来创建线程,还可以异步地执行函数并获取其结果。

#include <iostream>
#include <future>

int ThreadFunction() {
    // 线程要执行的代码
    return 42;
}

int main() {
    std::future<int> result = std::async(ThreadFunction);
    std::cout << "Result from the thread: " << result.get() << std::endl;

    return 0;
}

5、CreateThread与_beginthreadex 比较

_beginthreadex 与 CreateThread相比具有一些优势,主要体现在以下几个方面

1. C 运行时库支持:使用 _beginthreadex 创建线程时,C 运行时库(CRT)会自动进行一些初始化工作,确保 CRT 在新线程中可用且一致。这对于使用 CRT 提供的 I/O 函数、数学函数等全局或静态数据的线程安全至关重要。

2. 线程句柄管理:_beginthreadex`创建的线程在退出时会自动关闭线程句柄,而使用 CreateThread创建的线程则需要手动关闭句柄,这有助于避免资源泄漏。

3. 线程局部存储:_beginthreadex 为每个线程分配独立的局部存储,这对于使用依赖线程局部存储的 CRT 函数是必要的,而 CreateThread则没有这种机制。

总结,_beginthreadex在使用 C/C++ 运行时库的多线程编程中提供了一些便利和安全保障
 

6、std::thread与CreateThread比较

C++11的<thread>库和Windows API的CreateThread函数在创建和管理线程方面各有优势和劣势。

C++11 <thread>库的优势
1. 跨平台性:`std::thread`是C++11标准的一部分,可以在支持C++11的编译器上跨平台使用,而`CreateThread`是特定于Windows API的。
2. 现代C++特性:与C++的现代特性如lambda表达式、`std::function`等集成更好,易于使用。
3. RAII机制:线程的创建和销毁遵循RAII原则,即资源获取即初始化,可以自动管理线程生命周期,降低资源泄漏的风险。
4. 类型安全:可以调用任何可调用对象,不限于特定签名的函数指针,减少类型安全相关的bug。

C++11 <thread>库的劣势:
1. 功能限制:相比CreateThread,std::thread缺少一些高级功能,如设置线程栈大小或特定线程属性。
2. 性能:在某些情况下,使用std::thread可能会有额外的性能开销,尤其是当底层实现依赖于平台特定的线程库时。

Windows API CreateThread函数的优势:
1. 功能丰富:提供了更多控制线程创建的选项,例如可以指定线程的栈大小和创建标志。
2. 特定平台优化:在Windows平台上,CreateThread可能经过更多优化,与操作系统的集成更紧密。

Windows API CreateThread函数的劣势:
1. 平台依赖性:只能在Windows平台上使用,不具备跨平台的特性。
2. 使用复杂性:相比std::thread,CreateThread的使用可能更复杂,需要手动管理线程句柄和同步问题。

        在创建线程时,需要考虑线程的同步和互斥问题,以避免竞态条件和死锁。此外,合理地管理线程的生命周期,确保线程在结束时能够正确地释放资源,也是非常重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值