C++多线程几种方法

在 Windows 平台上,C++ 可以使用多种方法来实现多线程编程。以下是一些常见的方法:

1. Win32 API 线程

        使用 Win32 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) {
         // 等待线程结束
         WaitForSingleObject(hThread, INFINITE);
         CloseHandle(hThread);
       }
       return 0;
   }
#include <windows.h>

DWORD WINAPI ThreadFunction(LPVOID lpParam) {
    int* param = static_cast<int*>(lpParam);
    // 使用 param 中的值
    return 0;
}

int main() {
    int myParam = 10;
    // 创建线程,并将参数的地址传递给线程函数
    HANDLE hThread = CreateThread(NULL, 0, ThreadFunction, &myParam, 0, NULL);
    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }
    return 0;
}

2. C++11 `<thread>` 标准库

        C++11 引入了线程库,它提供了一个更高级别的抽象来创建和管理线程。使用 `std::thread` 类可以简化线程的创建和同步。

 #include <iostream>
   #include <thread>

   void ThreadFunction() {
       std::cout << "Thread is running" << std::endl;
   }

   int main() {
       std::thread t(ThreadFunction);
       t.join(); // 等待线程结束
       return 0;
   }
#include <iostream>
#include <thread>

void ThreadFunction(int param) {
    std::cout << "Parameter in thread: " << param << std::endl;
}

int main() {
    int myParam = 10;
    std::thread t(ThreadFunction, myParam);
    t.join();
    return 0;
}

如果参数较多或者需要传递复杂对象,你可以创建一个结构体或类实例来封装这些参数

#include <iostream>
#include <thread>

struct ThreadArgs {
    int param1;
    double param2;
    // 可以添加更多的参数
};

void ThreadFunction(ThreadArgs args) {
    std::cout << "Parameter 1 in thread: " << args.param1 << std::endl;
    std::cout << "Parameter 2 in thread: " << args.param2 << std::endl;
}

int main() {
    ThreadArgs args{10, 3.14};
    std::thread t(ThreadFunction, args);
    t.join();
    return 0;
}

3. _beginthreadex

        这是 Microsoft 提供的一个特定函数,用于在旧版本的 Visual C++ 中创建线程。它是一个较老的接口,与 `CreateThread` 类似,但在使用上略有不同。

 #include <windows.h>

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

   int main() {
       // 创建线程
       unsigned int threadID;
       HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, NULL, 0, &threadID);
       if (hThread) {
         // 等待线程结束
         WaitForSingleObject(hThread, INFINITE);
         CloseHandle(hThread);
       }
       return 0;
   }
#include <windows.h>

unsigned int __stdcall ThreadFunction(void* lpParam) {
    int* param = static_cast<int*>(lpParam);
    // 使用 param 中的值
    return 0;
}

int main() {
    int myParam = 10;
    // 创建线程,并将参数的地址传递给线程函数
    unsigned int threadID;
    HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, &myParam, 0, &threadID);
    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
    }
    return 0;
}

4. 纤程(Fibers)

        Windows 还提供了一种称为纤程的轻量级执行单元,它允许在同一个线程内进行类似线程的切换。纤程通过 `ConvertThreadToFiber` 和 `SwitchToFiber` 等函数进行管理。

5. 异步编程(Asynchronous Programming)

        使用 C++ 的异步编程模型,如 `std::async` 和 `std::future`,可以在不创建线程的情况下实现并发执行。

6. 并行模式库(Parallel Patterns Library, PPL)

        对于使用 Visual Studio 的开发者,PPL 提供了一组用于并行编程的高级抽象,例如 `concurrency::parallel_for` 和 `concurrency::task_group`。

7. Intel Threading Building Blocks (TBB)

        TBB 是一个高性能的并行编程库,它提供了任务并行、并行算法等高级抽象。

8. OpenMP

        OpenMP 是一种用于共享内存并行编程的 API,它通过编译时指令或运行时库函数来实现多线程。

        C++11 的 `<thread>` 库提供了一个现代、便携且易于使用的方式来编写多线程程序,但在某些需要更细粒度控制的场景下,Win32 API 或其他方法可能更合适。

相关推荐

  1. C++线方法

    2024-06-14 20:06:01       7 阅读
  2. c++ 线状态

    2024-06-14 20:06:01       17 阅读
  3. QT 创建线方法

    2024-06-14 20:06:01       27 阅读
  4. MFC四方法编写线

    2024-06-14 20:06:01       5 阅读
  5. 创建线方式,及线的生命周期?

    2024-06-14 20:06:01       11 阅读
  6. C++ 线

    2024-06-14 20:06:01       26 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-14 20:06:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-14 20:06:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-14 20:06:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-14 20:06:01       18 阅读

热门阅读

  1. Pytorch Lighting & Hydra库的学习

    2024-06-14 20:06:01       7 阅读
  2. C++库tops( Libraries C++)

    2024-06-14 20:06:01       9 阅读
  3. Python中的“*”和“**”

    2024-06-14 20:06:01       8 阅读
  4. 前端开发之HTTP协议认识

    2024-06-14 20:06:01       7 阅读
  5. Web前端在深圳:探索技术与创新的融合之地

    2024-06-14 20:06:01       6 阅读
  6. 系统编程 - kill,alarm,read,write

    2024-06-14 20:06:01       7 阅读
  7. 学习笔记——交通安全分析04

    2024-06-14 20:06:01       7 阅读
  8. 在Android Studio中将某个文件移出Git版本管理

    2024-06-14 20:06:01       6 阅读
  9. 好用的国内镜像源

    2024-06-14 20:06:01       3 阅读
  10. 力扣刷题总结 -- 数组26

    2024-06-14 20:06:01       7 阅读
  11. Linux之history历史指令查看

    2024-06-14 20:06:01       6 阅读
  12. Leetcode:合并两个有序链表

    2024-06-14 20:06:01       6 阅读