在C 中列出线程队列
Making a queue of threads in C++
我正在尝试一个接一个地运行线程。我知道我可以连续执行它们,但整个点就是命令不会阻止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()
在后台开始作业。
相关文章:
- 为什么我的多线程作业队列崩溃
- 在c++队列中使用pop和visit实现线程安全
- 共享队列的线程安全
- 线程安全队列 c++
- 将项目添加到队列时运行线程
- 线程安全的引用计数队列C++
- 对C++中的队列进行多线程访问
- asio::io_service 具有多个线程的优先级队列处理
- C++11如何在1个线程中使用条件变量处理2个线程安全队列
- QtThread:I/O 队列的工作线程
- 如何做 gtkmm 线程安全队列绘制?
- 线程安全队列出现分段错误
- 一个好的线程池队列大小
- 从调度队列块 [ swift / c++ ] 创建线程
- Qt的事件循环线程是安全的还是原子的?处理"队列连接"时如何同步?
- IPC Unix 消息队列线程安全吗?
- 在多线程中使用LinkedList队列
- 工作线程队列的这种变体是某种模式或通用结构吗?
- 多线程队列原子操作
- 如何进行多线程队列处理