• 线程池的实现


    下面是一个考虑了任务优先级、异常处理和线程复用的线程池实现:

    1. #include <iostream>
    2. #include <queue>
    3. #include <functional>
    4. #include <future>
    5. #include <thread>
    6. #include <vector>
    7. #include <mutex>
    8. #include <condition_variable>
    9. enum class TaskPriority {
    10. Low,
    11. Normal,
    12. High
    13. };
    14. class ThreadPool {
    15. public:
    16. ThreadPool(size_t numThreads) : stop(false) {
    17. for (size_t i = 0; i < numThreads; ++i) {
    18. workers.emplace_back([this] {
    19. while (true) {
    20. std::function<void()> task;
    21. {
    22. std::unique_lock<std::mutex> lock(queueMutex);
    23. condition.wait(lock, [this] { return stop || !taskQueue.empty(); });
    24. if (stop && taskQueue.empty()) {
    25. return;
    26. }
    27. task = std::move(taskQueue.top().task);
    28. taskQueue.pop();
    29. }
    30. try {
    31. task(); // Execute the task
    32. } catch (const std::exception& ex) {
    33. std::cerr << "Exception in thread: " << std::this_thread::get_id() << ", Error: " << ex.what() << std::endl;
    34. }
    35. }
    36. });
    37. }
    38. }
    39. template <class F, class... Args>
    40. auto enqueue(TaskPriority priority, F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> {
    41. using ReturnType = typename std::result_of<F(Args...)>::type;
    42. auto task = std::make_shared<std::packaged_task<ReturnType()>>(std::bind(std::forward(f), std::forward(args)...));
    43. std::future<ReturnType> res = task->get_future();
    44. {
    45. std::unique_lock<std::mutex> lock(queueMutex);
    46. taskQueue.emplace(priority, [task]() { (*task)(); });
    47. }
    48. condition.notify_one();
    49. return res;
    50. }
    51. ~ThreadPool() {
    52. {
    53. std::unique_lock<std::mutex> lock(queueMutex);
    54. stop = true;
    55. }
    56. condition.notify_all();
    57. for (std::thread& worker : workers) {
    58. worker.join();
    59. }
    60. }
    61. private:
    62. struct Task {
    63. TaskPriority priority;
    64. std::function<void()> task;
    65. Task(TaskPriority p, std::function<void()> t) : priority(p), task(std::move(t)) {}
    66. // Custom comparison operator for task priority
    67. bool operator<(const Task& other) const {
    68. return priority < other.priority;
    69. }
    70. };
    71. std::vector<std::thread> workers;
    72. std::priority_queue<Task> taskQueue;
    73. std::mutex queueMutex;
    74. std::condition_variable condition;
    75. bool stop;
    76. };
    77. // 示例任务函数
    78. void printNumber(int number) {
    79. std::cout << "Number: " << number << ", Thread: " << std::this_thread::get_id() << std::endl;
    80. }
    81. int main() {
    82. // 创建线程池,指定线程数
    83. ThreadPool pool(4);
    84. // 提交任务到线程池
    85. for (int i = 0; i < 10; ++i) {
    86. auto task = [i] {
    87. printNumber(i);
    88. };
    89. if (i % 2 == 0) {
    90. pool.enqueue(TaskPriority::High, task);
    91. } else {
    92. pool.enqueue(TaskPriority::Normal, task);
    93. }
    94. }
    95. // 等待任务执行完成
    96. std::this_thread::sleep_for(std::chrono::seconds(1));
    97. return 0;
    98. }

    在这个示例中,线程池类ThreadPool增加了以下功能:

    • TaskPriority枚举:用于表示任务的优先级,分为低、正常和高。
    • Task类型:表示存储任务和优先级的数据结构。
    • TaskPriorityComparator:用于任务优先级比较的比较器结构体。
    • enqueue函数:在提交任务时,需要指定任务的优先级。任务被封装为std::function,并存储在任务队列中。任务执行时,会捕获并处理可能抛出的异常。

    main函数中,示例代码提交了10个任务函数printNumber到线程池中进行执行。其中,奇数任务的优先级为TaskPriority::Normal,偶数任务的优先级为TaskPriority::High。最后,通过等待1秒让主线程暂停,以确保所有任务都有机会被线程池中的工作线程执行。

    这个示例实现了一个更完整的线程池,考虑了任务优先级、异常处理和线程复用。每个任务都可以设置优先级,并且线程池会根据优先级来执行任务。同时,异常处理机制可以捕获任务执行过程中可能抛出的异常,以便进行相应的处理。线程复用则通过循环执行任务的方式来实现,使得线程可以重复执行多个任务,而不需要频繁地创建和销毁线程。

    请注意,这只是一个简单的线程池实现示例,实际使用时可能需要根据具体需求进行更多的功能和细节处理。例如,可以添加更多的线程管理策略,如动态调整线程数量、限制最大并发数等。

  • 相关阅读:
    大数据学习1.1-Centos8虚拟机安装
    pandas学习笔记
    兼容国产化神通数据库遇到的问题适配
    Spring Cloud 微服务2
    3.pytorch学习:conv2d——2d卷积
    debian 修改镜像源为阿里云【详细步骤】
    AIDL for HALs实战
    使用 docker buildx 构建跨平台镜像 (QEMU/buildx/build)
    react合成事件——bind解决this指向——箭头函数解决this指向
    14:00面试,15:00就出来了,问的问题过于变态了。。。
  • 原文地址:https://blog.csdn.net/m0_73915763/article/details/132652606