std::thread::swap的目的是什么?

5

据我所知,std::thread::swap会交换两个线程的线程ID,但不会改变线程本地存储或以任何方式影响任一线程的执行。它的目的是什么?它在哪里和如何使用?


除了线程 ID 的所有者外,什么是 std::thread - François Andrieux
2个回答

3

不要把它看作是“交换两个线程的线程ID”,而是把它看作是交换两个线程变量:

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 进行交换,即使是那些不能被复制的变量也可以。我不确定为什么他们还为 std::thread 创建了一个 swap 成员函数。
这很有用,因为你可以对 vector 中的 thread 进行排序。排序算法将使用 swap 来重新排列向量中的线程。请记住,在 C++ 中无法移动对象,只能移动它们的内容。 swap 和移动语义允许您将大多数对象的内容移动到不同的对象中。对于 thread,它会移动指向线程的 "指针"。

参见复制并交换惯用语,了解另一种有用的情况。 - user4581301
“我不确定为什么他们还创建了...”:创建一个成员函数(因为私有状态而需要),专门使用该成员函数来实现std::swap。现在可以使用std::swap通用地交换线程。 - Richard Critten
@RichardCritten 线程也可以使用 std::swap 进行交换,而不必使用成员函数。成员函数之所以存在是因为它比通用的 std::swap 更高效。 - eerorika
@RichardCritten friend 存在并且通常用于这种情况。 - user253751

2

std::thread 是一种内部引用类型,类似于例如 std::vector 的方式。在内部,std::vector 也只是简单地引用存储在动态内存中的内存缓冲区。

您所描述的是这些类型如何进行交换的方式。交换向量仅交换指向缓冲区的指针(以及一些簿记信息)- 操作不会影响存储的对象。这些指针是对资源的“句柄”。类似地,交换线程会交换内部线程 ID - 这是对线程资源的句柄 - 而不会影响所引用线程的状态。

至于交换的目的...它只是一件有用的事情。它最常用于排序和其他重新排序算法中。我不知道重新排序线程对象的特定原因,但我也不知道为什么那不可能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接