Ja som napísal viacvláknový program podobný nasledujúcej štruktúre (ja som vynechal mutex a cudzí kód) a blokuje pri volaní boost::thread_group.add_thread()
keď sa volá z vlákna. Existuje nejaký spôsob, ako to hovoriť, takže hovor nie je blokovaný?
boost::thread_group group;
void threaded_function2()
{
}
void threaded_function()
{
if( condition)
{
boost::thread *t3 = new boost::thread( boost::bind( &threaded_function2));
group.add_thread( t3); // <-- Blocks on this call
}
}
int main()
{
boost::thread *t1 = new boost::thread( boost::bind( &threaded_function));
boost::thread *t2 = new boost::thread( boost::bind( &threaded_function));
group.add_thread( t1);
group.add_thread( t2);
group.join_all();
return 0;
}
Ďakujem všetkým.
odpovede:
3 pre odpoveď č. 1Opravte ma, ak sa mýlim, ale čo by mohlo byťže sa stalo, že spojenie join_all prebehlo predtým, ako sa vlákno dostalo do pridania, čím sa vytvorí blok objektu object_group, kým sa neuvoľnia ostatné vlákna. Jedným z riešení je urobiť mutex na hlavnej funkcii čakať na vykonanie funkcií thread_, aby sa zavolala metóda join_all. Toto je však zlá konštrukcia.