2013-03-17 10 views
0

Я проходил новую поддержку многопоточности, которая присутствует в C++ 0x (C++ 11).поведение идентификатора потока в C++ 11

Таким образом, существует уникальный идентификатор типа std :: thread: id для каждого потока.

Рассмотрим следующий пример программы:

void hello_world() 
{ 
    std::cout<<"hello_world \n"; 
} 

int main() 
{ 

    std::cout<<"Main thread id is "<<std::this_thread::get_id()<<"\n"; 

    std::thread t(hello_world); 

    std::cout<<"Child thread id is "; 
    std::cout<<t.get_id()<<"\n"; 
    t.join(); 
} 

я получил пример вывода следующим образом:

Основная нить идентификатор 140502917359424

Дочерний поток идентификатор 140502900623104

hello_world

Идентификатор потока основного поток из моего выходного примера больше, чем у дочернего потока.

Являются ли идентификаторы потоков полностью независимыми от времени их запуска?

Если нет: существует ли способ отличить, был ли поток T1 начат раньше, чем поток T2 только из идентификатора потока?

ответ

8

std::thread::get_id() - это просто произвольное значение, его единственным свойством является то, что он гарантированно будет уникальным для каждого выполняемого в настоящий момент потока (но когда поток заканчивается, его идентификатор может быть повторно использован).

Чтобы сообщить, с какой темы началось сначала, вам просто нужно сделать это самостоятельно: например. поддерживать счетчик и как-то ассоциировать значение с потоком, либо путем обертывания обоих в классе, либо передачи значения функции потока, либо с использованием локального хранилища потоков ... Вы получаете эту идею.

Я не могу придумать какой-либо C++ или системный объект, который сделает это за вас, может быть, потому, что обычно бессмысленно знать относительный порядок создания связки потоков. Вы просто стреляете в них и позволяете им выполнять свою работу.

3

Не может быть строгого отношения между идентификатором потока и созданием резьбы. Темы создаются другими потоками, поэтому это создание потенциально происходит параллельно. Обычно идентификатор потока - это просто (переинтерпретированный) указатель на внутреннее состояние потока, поэтому вы не должны пытаться что-либо интерпретировать в нем.

Смежные вопросы