Параллельное программирование на С++ в действии. Практика разработки многопоточных программ | страница 37
>a и >b то >а<с
и так далее. В стандартной библиотеке имеется также класс >std::hash
, поэтому значения типа >std::thread::id
можно использовать и в качестве ключей новых неупорядоченных ассоциативных контейнеров.Объекты >std::thread::id
часто применяются для того, чтобы проверить, должен ли поток выполнить некоторую операцию. Например, если потоки используются для разбиения задач, как в листинге 2.8, то начальный поток, который запускал все остальные, может вести себя несколько иначе, чем прочие. В таком случае этот поток мог бы сохранить значение >std::this_thread::get_id()
перед тем, как запускать другие потоки, а затем в основной части алгоритма (общей для всех потоков) сравнить собственный идентификатор с сохраненным значением.
>std::thread::id master_thread;
>void some_core_part_of_algorithm() {
> if (std::this_thread::get_id() == master_thread) {
> do_master_thread_work();
> }
> do_common_work();
>}
Или можно было бы сохранить >std::thread::id
текущего потока в некоторой структуре данных в ходе выполнения какой-то операции. В дальнейшем при операциях с той же структурой данных можно было сравнить сохраненный идентификатор с идентификатором потока, выполняющего операцию, и решить, какие операции разрешены или необходимы.
Идентификаторы потоков можно было бы также использовать как ключи ассоциативных контейнеров, если с потоком нужно ассоциировать какие-то данные, а другие механизмы, например поточно-локальная память, не подходят. Например, управляющий поток мог бы сохранить в таком контейнере информацию о каждом управляемом им потоке. Другое применение подобного контейнера — передавать информацию между потоками.
Идея заключается в том, что в большинстве случаев >std::thread::id
вполне может служить обобщенным идентификатором потока и лишь, если с идентификатором необходимо связать какую-то семантику (например, использовать его как индекс массива), может потребоваться другое решение. Можно даже выводить объект >std::thread::id
в выходной поток, например >std::cout
:
>std::cout << std::this_thread::get_id();
Точный формат вывода зависит от реализации; стандарт лишь гарантирует, что результаты вывода одинаковых идентификаторов потоков будут одинаковы, а разных — различаться. Поэтому для отладки и протоколирования это может быть полезно, но так как никакой семантики у значений идентификаторов нет, то сделать на их основе какие-то другие выводы невозможно.