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();
    }