Усиление блоков thread_group при вызове add_thread из потока, почему? - PullRequest
0 голосов
/ 23 октября 2011

Я написал многопоточную программу, похожую на следующую структуру (я исключил мьютекс и посторонний код), и она блокирует вызов boost::thread_group.add_thread() при вызове из потока. Есть ли способ обойти это, чтобы звонок не блокировался?

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;
}

Спасибо всем.

1 Ответ

3 голосов
/ 23 октября 2011

Поправьте меня, если я ошибаюсь, но здесь может произойти то, что вызов join_all выполнялся до добавления потока, делая объектный блок thread_group, пока другие потоки не будут освобождены. Одним из решений является создание мьютекса в главной функции для ожидания завершения threadaded_function для вызова метода join_all. Хотя это плохой дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...