Надежен ли поток :: thread? - PullRequest
       13

Надежен ли поток :: thread?

2 голосов
/ 15 февраля 2012

является ли Boost :: Thread Object потокобезопасным? Должен ли я заблокировать вызов методов-членов boost :: thread (например, join) для обеспечения безопасности потока?

РЕДАКТИРОВАТЬ 1: Пожалуйста, не беспокойтесь о моей цели. Вы можете просто ответить на вопрос?

РЕДАКТИРОВАТЬ 2 (для тех, кто не удовлетворен РЕДАКТИРОВАТЬ 1): Моя цель: Рассмотрим одну процедуру как программу для потока, одну процедуру, которая останавливает этот поток. Процедура потока является условием проверки цикла, продолжать ли. Процедура Stop устанавливает условие в FALSE и ожидает окончания потока (join), а затем выполняет некоторые другие действия. Дело в том, что процедура остановки может вызывать более одного потока.

Но мой вопрос общий, рассмотрим несколько следующих потоков, вызывающих одновременно методы-члены одного объекта потока, такие как get_id (), native_handle () и т. Д.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Присоединение к потоку должно быть сделано только из одного другого потока (предпочтительно потока, который его запустил).В этом случае нет смысла в безопасности потоков

Хорошо, я на самом деле просмотрел исходный код boost :: thread:

void thread::join()
{
    detail::thread_data_ptr const local_thread_info=(get_thread_info)();
    if(local_thread_info)
    {
        bool do_join=false;

        {
            unique_lock<mutex> lock(local_thread_info->data_mutex);
            while(!local_thread_info->done)
            {
                local_thread_info->done_condition.wait(lock);
            }
            do_join=!local_thread_info->join_started;

            if(do_join)
            {
                local_thread_info->join_started=true;
            }
            else
            {
                while(!local_thread_info->joined)
                {
                    local_thread_info->done_condition.wait(lock);
                }
            }
        }
        if(do_join)
        {
            void* result=0;
            BOOST_VERIFY(!pthread_join(local_thread_info->thread_handle,&result));
            lock_guard<mutex> lock(local_thread_info->data_mutex);
            local_thread_info->joined=true;
            local_thread_info->done_condition.notify_all();
        }

        if(thread_info==local_thread_info)
        {
            thread_info.reset();
        }
    }
}

И кажется, что да, этоПотокобезопасен.

0 голосов
/ 05 декабря 2012

boost::thread не потокобезопасен.

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