Multithreading 如何在删除线程池之前加入所有线程

Multithreading 如何在删除线程池之前加入所有线程,multithreading,c++11,mutex,Multithreading,C++11,Mutex,我使用的是一个多线程类,它在自己的线程池中创建所需数量的线程,并在使用后删除自己 std::thread *m_pool; //number of threads according to available cores std::mutex m_locker; std::condition_variable m_condition; std::atomic<bool> m_exit; int m_processors m_pool = new std::thre

我使用的是一个多线程类,它在自己的线程池中创建所需数量的线程,并在使用后删除自己

std::thread *m_pool;      //number of threads according to available cores
std::mutex m_locker;
std::condition_variable m_condition;
std::atomic<bool> m_exit;
int m_processors    

m_pool = new std::thread[m_processors + 1]

void func()
{
   //code
}

for (int i = 0; i < m_processors; i++)
{
    m_pool[i] = std::thread(func);
}

void reset(void)
{
    {
        std::lock_guard<std::mutex> lock(m_locker);
        m_exit = true;
    }
    m_condition.notify_all();

    for(int i = 0; i <= m_processors; i++)
        m_pool[i].join();
    delete[] m_pool;
}
std::thread*m_池//根据可用内核的线程数
std::互斥m_锁;
std::条件变量m_条件;
std::原子m_出口;
int m_处理器
m_pool=new std::thread[m_处理器+1]
void func()
{
//代码
}
对于(int i=0;i对于(inti=0;i我认为是简单的打字错误)


你的循环有条件
i问题的真正根源由Wick的答案解决。我将用一些技巧扩展它,这些技巧也可以解决你的问题,同时改进代码的其他方面

如果使用C++ 11来编写代码> STD::Tox< /Cord>,那么你不应该用<代码>运算符new []/Cube来创建线程句柄。有更好的方法可以用其他C++构造来实现,这将使所有的东西变得更简单<强>和异常安全< /强>(如果抛出意外的异常,你不会泄漏内存)。

  • 将线程对象存储在
    std::vector
    中。它将为您管理内存分配和释放(不再是
    new
    delete
    )。如果动态插入/删除线程,您可以使用其他更灵活的容器,如
    std::list

  • std::generate
    或类似内容填充向量



注意循环条件
i
i
std::vector<std::thread> m_pool;
m_pool.reserve(n_processors);

// Fill the vector
std::generate_n( std::back_inserter(m_pool), m_processors, 
                 [](){ return std::thread(func); } );
for( std::thread& t: m_pool ) {
  t.join();
}
m_pool.clear();