C++ 如何实现线程列表
我想实现一个线程列表,比如一个线程池,它有像C++ 如何实现线程列表,c++,multithreading,C++,Multithreading,我想实现一个线程列表,比如一个线程池,它有像add(),join\u all()这样的接口。我只是将线程推入其中,不需要管理线程销毁 我试过: 线程池,但它会在启动时创建一组线程,以提高性能。但性能不是我关心的问题,我希望我的线程列表在空闲时不创建任何线程,只按需创建线程 boost::thread\u group,但它不会释放线程,除非它自己被释放,这会导致进程中的线程越来越多 boost::asio::io_context,我可以将作业发布到它,但是它是单线程的,作业依次执行,我必须创建许多
add()
,join\u all()
这样的接口。我只是将线程推入其中,不需要管理线程销毁
我试过:
线程池
,但它会在启动时创建一组线程,以提高性能。但性能不是我关心的问题,我希望我的线程列表在空闲时不创建任何线程,只按需创建线程boost::thread\u group
,但它不会释放线程,除非它自己被释放,这会导致进程中的线程越来越多boost::asio::io_context
,我可以将作业发布到它,但是它是单线程的,作业依次执行,我必须创建许多线程来调用io_context.run()
以使其异步,在这种情况下,问题与线程池
相同
//thread\u list.h
#布拉格语一次
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构线程列表{
线程列表();
~thread_list();
typedef无符号长id;
id\u t id=0;
映射线程;
std::列表完成;
std::互斥mtx;
std::条件变量cv;
bool-stopped=false;
标准:螺纹清洁剂;
voidadd(std::function);
};
线程列表::线程列表()
:thrd_清洁器([此]{
对于(;;){
std::唯一锁(mtx);
cv.等待(锁定);
如果(停止){
lock.unlock();
用于(自动和pr:map\u线程){
pr.second.join();
}
返回;
}
//获取第一个完成的线程,将其移除
如果(list_done.size()>0){
//从列表中删除\u完成
auto tid=list_done.front();
列表_done.pop_front();
//从映射线程中删除
自动iter=map\u thread.find(tid);
if(iter!=map_thread.end()){
iter->second.join();
映射线程擦除(iter);
}
}
}
})
{}
线程列表::~thread\u list(){
使用名称空间std;
{
锁和防护锁(mtx);
停止=真;
}
cv.通知_one();
thrd_cleaner.join();
}
无效线程列表::添加(函数fn){
使用名称空间std;
锁和防护锁(mtx);
如果(停止)返回;
自动tid=id++;
map_thread[tid]=线程([fn,tid,this]{
//1.调用原点函数
fn();
//2.标记螺纹已完成
{
锁\防护锁(此->mtx);
此->列表完成。向后推(tid);
}
//3.通知清洁工
此->cv.notify_one();
});
}
测试代码:
#include <iostream>
using namespace std;
#include "./thread_list.h"
void test_normal_usage() {
thread_list l;
for(int i=0; i<100; i++) { // create 100 threads
l.add([i]{ cout << i << endl; });
}
}
int main() {
test_normal_usage();
}
#包括
使用名称空间std;
#包括“/thread_list.h”
无效测试\u正常使用情况(){
线程列表l;
对于(int i=0;i使用条件变量来检测何时从\u map
中删除线程,您可以使用一个条件变量来指示映射何时为空,但最好是保持线程的可连接性并将它们全部连接起来。这里的问题是,您的列表通过调用t.detach()放弃了线程所有权它应该保留线程,然后通过调用join()等待它们完成
。也不需要创建线程来实现异步。互斥锁是否同时被析构函数和lambda锁定?谢谢。现在它使用条件变量并跟踪线程。我已经更新了post.use条件变量以检测何时从\u map
中删除线程。您可以使用条件变量当映射为空时,这可能会发出信号,但最好是保持线程的可连接性并将它们全部连接起来。这里的问题是,您的列表通过调用t.detach();
,放弃了线程所有权。它应该通过调用join()来保持线程,然后等待线程完成
。也不需要创建线程来实现异步。互斥锁是否同时被析构函数和lambda锁定?谢谢。现在它使用条件变量并跟踪线程。我已经更新了帖子。
#include <iostream>
using namespace std;
#include "./thread_list.h"
void test_normal_usage() {
thread_list l;
for(int i=0; i<100; i++) { // create 100 threads
l.add([i]{ cout << i << endl; });
}
}
int main() {
test_normal_usage();
}