我正在使用boost::thread_group
创建(使用
thread_group::create_thread()
)和派遣线程。为了限制
最大线程数,在每个线程的末尾,我删除线程
从thread_group
并删除线程本身(以便我可以
决定是否需要创建新线程)。然而它挂了
介于最后一个线程的创建和删除之间(比如说
总共999个中的第999个。
我的问题是:
以下是相关代码:
// 1-创建和分派线程的代码
{
//mutex for map<thread_id, thread*> operations
boost::mutex::scoped_lock lk(m_mutex_for_ptr);
// create a thread for this->f(duplicate_hashes)
boost::thread* p = m_thread_group.create_thread(boost::bind(
&detectiveT<equal_predicate>::f,
this,
duplicate_hashes
));
// save the <thread_id,thread pointer> map for later lookup & deletion
m_thread_ptrs.insert(make_pair(p->get_id(), p));
// log to console for debug
cout << "thread created: "
<< p->get_id() << ", "
<< m_thread_group.size() << ", " m_thread_ptrs.size() <<
"\n";
}
//线程执行的代码
void f(list<map_iterator_type>& l)
{
Do_something(l);
boost::this_thread::at_thread_exit(boost::bind(
&detectiveT<equal_predicate>::remove_this_thread,
this
));
}
//删除线程本身的代码
void remove_this_thread()
{
{
//mutex for map<thread_id, thread*> operations
boost::mutex::scoped_lock lk(m_mutex_for_ptr);
boost::thread::id this_id(boost::this_thread::get_id());
map<boost::thread::id, boost::thread*>::iterator itr;
itr = (m_thread_ptrs.find(this_id));
if(m_thread_ptrs.end() != itr)
{
// remove it from the control of thread_group
m_thread_group.remove_thread(itr->second);
// delete it
delete itr->second;
// remove from the map
m_thread_ptrs.erase(this_id);
// log to console for debug
cout << "thread erased: "
<< this_id << ", "
<< m_thread_group.size() << ", "
<< m_thread_ptrs.size() << "\n";
}
}
}
答案 0 :(得分:4)
为什么不尝试回收线程,因为创建/销毁很昂贵?
编写线程池类并向其发送任务。如果没有更多可用线程,则池将对任务进行排队,如果current_threads&lt;则创建线程。 max_threads或只使用可用的线程。
建议实施:
找出理想的线程数。这通常等于处理器的数量。 根据您希望的复杂程度,您可以立即创建池中的所有线程,或者如果current-thread-count&lt;理想线程计数和所有现有线程正在忙于执行任务。
假设您一次创建所有线程,则需要将worker函数传递给每个要执行的线程。此worker函数将等待任务变为可用,然后执行它们。因为该函数执行任务或等待它,它将不会返回并且该线程不会被销毁。
线程池可以跟踪任务队列并管理等待条件,该条件指示队列中何时有可用任务。每个线程工作器函数等待等待条件,当有任务可用时,它会唤醒并尝试执行该任务。 你必须做一些同步;最简单的方法是尝试找到一个可用的线程池实现,比如Windows中的那个(Vista +我认为)或者QtConcurrent中的那个,这将允许你只是通过任务,调用运行并让操作系统/库担心一切。
稍后编辑: