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