在C 中列出线程队列

Making a queue of threads in C++

本文关键字:线程 队列      更新时间:2023-10-16

我正在尝试一个接一个地运行线程。我知道我可以连续执行它们,但整个点就是命令不会阻止UI。

但是,在我提出的实现中,我无法使用std::thread,因为我无法将线程作为参数。

有其他方法可以做到吗?


这是我当前的实现:

#include <mutex>
#include <thread>
#include <queue>
class ThreadQueue {
    std::queue <std::thread> threads;
    std::mutex mutex_add;
    std::mutex mutex_remove;
public:
   ThreadQueue() {}
    ~ThreadQueue() {}
    void add(std::thread thread) {
        mutex_add.lock();
        threads.push(thread);
        mutex_add.unlock();
    }
    std::thread remove() {
        mutex_remove.lock();
        std::thread thread = threads.front;
        threads.pop();
        thread.join();
        mutex_remove.unlock();
    }
};

我知道我可以连续执行它们,但是全部是命令不会阻止UI。


有其他方法可以做到吗?

已经提到了std::thread是一种可移动的类类型,您可以使用std::move()在队列中转移它们。


,但我认为使用std::thread实例的队列不是一个好设计。

让我们假设您将线程实例放在使用线程函数的队列中,它将立即启动。那么,这里队列的作用是什么?
线程后是否启动时,线程是否应该从队列中弹出?谁去join()


@alexeibs建议您应该具有一个线程,该线程执行UI背景任务(例如std::function对象),将从队列中读取。

您甚至可以通过多个线程(aka thread Pool )共享此类任务队列,并最大化可用的CPU内核的利用率(理想情况下,您不应该拥有比可用CPU内核更多的活动线程)。

应该将同步(静音,通知等条件变量等)应用于队列本身。

您可以移动线程:

因此,您可以像这样修复代码。

void add(std::thread&& thread) {
          //        ^^   
        mutex_add.lock();
        threads.push(std::move(thread));
          //         ^^^^^^^^^
        mutex_add.unlock();
    }

,但说还有其他方法可以解决这个问题。

而不是可以添加和删除线程的队列。有一个由对象拥有的线程执行的作业队列。或者,您只需使用std::async()在后台开始作业。