thread_group::create_thread()
을 생성하고 쓰레드를 생성하기 위해 boost::thread_group
을 사용하고 있습니다. 최대 스레드 수를 각 스레드의 끝에 제한하기 위해 thread_group
에서 스레드 을 제거하고 스레드 자체를 삭제합니다 (따라서 새 스레드를 생성해야하는지 여부를 결정할 수 있음). 그러나 마지막 스레드 (예 : 999 번째 999 번째 합계)의 생성과 삭제 사이에 이 있습니다.boost.thread 데드 록 및 자기 삭제
내 질문은 :
- 그것이 내가하는 일처럼 자체 내에서 에서 스레드를 삭제 OK인가? 이 아닌 경우 달성 할 수있는 가장 좋은 방법
- 왜 코드가 중단됩니까? 이하
는 관련 코드이다 : 만들
// 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";
}
// 2- 코드
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
));
}
// 3 코드는 스레드 자체를 삭제합니다.
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";
}
}
}
? procexp.exe의 –
에서 모든 스레드가 "대기 : UserRequest"상태에 있음을 알 수 있습니다. thread_group 내부 잠금과 소개하는 외부 잠금 (즉, lk (m_mutex_for_ptr))간에 재귀 잠금이 발생한다고 생각하지만 확실하지 않습니다. 나는이 행을 주석 처리함으로써 운이 좋았습니다. <<< m_thread_group.size() << >>, void_retis_thread()에서 그 행을 재현 할 수 없었습니다. –
@ Lightness Races in Orbit :'detach() '스레드에서 삭제하고 개체를 삭제하십시오. 그러면 스레드가 종료 될 때 스레드가 자원을 자동으로 해제합니다 (http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_create.3.html 참조). 그렇지 않으면 아무도 종료 할 때 아무도 참여하지 못하기 때문에 스스로 결합하여 교착 상태가되거나 좀비가됩니다. –