据我所知,std::thread::swap会交换两个线程的线程ID,但不会改变线程本地存储或以任何方式影响任一线程的执行。它的目的是什么?它在哪里和如何使用?
据我所知,std::thread::swap会交换两个线程的线程ID,但不会改变线程本地存储或以任何方式影响任一线程的执行。它的目的是什么?它在哪里和如何使用?
不要把它看作是“交换两个线程的线程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
,它会移动指向线程的 "指针"。std::swap
。现在可以使用std::swap
通用地交换线程。 - Richard Crittenstd::swap
进行交换,而不必使用成员函数。成员函数之所以存在是因为它比通用的 std::swap
更高效。 - eerorikafriend
存在并且通常用于这种情况。 - user253751std::thread
是一种内部引用类型,类似于例如 std::vector
的方式。在内部,std::vector
也只是简单地引用存储在动态内存中的内存缓冲区。
您所描述的是这些类型如何进行交换的方式。交换向量仅交换指向缓冲区的指针(以及一些簿记信息)- 操作不会影响存储的对象。这些指针是对资源的“句柄”。类似地,交换线程会交换内部线程 ID - 这是对线程资源的句柄 - 而不会影响所引用线程的状态。
至于交换的目的...它只是一件有用的事情。它最常用于排序和其他重新排序算法中。我不知道重新排序线程对象的特定原因,但我也不知道为什么那不可能。
std::thread
? - François Andrieux