Какова цель std :: thread :: swap? - PullRequest
1 голос
/ 20 февраля 2020

Насколько я понимаю, std :: thread :: swap меняет идентификаторы потоков двух потоков. Это не меняет локальное хранилище потока и никак не влияет на выполнение любого из потоков. Какова цель этого? Как / где / почему это используется?

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020

Не думайте об этом как о "обмене идентификаторами потоков двух потоков", думайте об этом как об обмене двумя потоками переменных :

std::thread a(...); // starts thread 1
std::thread b(...); // starts thread 2
a.swap(b); // or std::swap(a, b);
// now variable a points to thread 2
// and variable b points to thread 1

Большинство переменных можно поменять местами с помощью std::swap, даже те, которые не могут быть скопированы. Я не уверен, почему они также создали swap функцию-член для std :: thread.

Это полезно, потому что вы можете, например, sort a vector thread с. Алгоритм сортировки будет использовать swap для перестановки потоков в векторе. Помните, что объекты не могут быть перемещены в C ++, только их содержимое. swap и перемещение семантики позволяют перемещать содержимое большинства объектов в разные объекты. Для thread он перемещает «указатель» на поток.

2 голосов
/ 20 февраля 2020

std::thread является внутренне ссылочным типом - аналогично тому, как, например, std::vector. Внутренне, std::vector слишком просто относится к буферу памяти, хранящемуся в динамической c памяти.

Что вы описываете, это то, как своп работает с такими типами. Замена вектора просто заменяет указатели на буферы (а также некоторую информацию о бухгалтерском учете) - операция не затрагивает ни один из сохраненных объектов. Эти указатели являются «ручками» ресурса. Точно так же замена потоков меняет внутренний идентификатор потока, который является дескриптором ресурса потока, без влияния на состояние упомянутых потоков.

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

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