【发布时间】:2020-02-20 18:24:04
【问题描述】:
据我了解,std::thread::swap 交换了两个线程的线程 ID。它不会以任何方式更改线程本地存储或影响任何一个线程的执行。其背后的目的是什么?如何/在哪里/为什么使用它?
【问题讨论】:
-
除了线程 ID 的所有者之外,
std::thread是什么?
标签: c++ multithreading c++11
据我了解,std::thread::swap 交换了两个线程的线程 ID。它不会以任何方式更改线程本地存储或影响任何一个线程的执行。其背后的目的是什么?如何/在哪里/为什么使用它?
【问题讨论】:
std::thread 是什么?
标签: c++ multithreading c++11
不要认为是“交换两个线程的线程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 成员函数。
这很有用,因为您可以,例如,sort 和 vector 的 threads。排序算法将使用swap 重新排列向量中的线程。请记住,在 C++ 中不能移动对象,只能移动它们的内容。 swap 和移动语义,允许您将大多数对象的内容移动到不同的对象中。对于thread,它将“指针”移动到线程。
【讨论】:
std::swap使用成员函数。现在线程可以使用std::swap进行一般交换
std::swap 进行交换。成员函数的原因是它可以比通用的std::swap 更有效。
friend 存在并且通常用于此类事情。
std::thread 是内部引用类型 - 类似于 std::vector 的方式。在内部,std::vector 也只是指存储在动态内存中的内存缓冲区。
您所描述的是交换如何与这些类型一起工作。交换向量仅交换指向缓冲区的指针(以及一些簿记信息) - 存储的对象都不会受到操作的影响。这些指针是资源的“句柄”。类似地,交换线程会交换内部线程 id - 这是线程资源的句柄 - 而不会影响引用线程的状态。
至于交换的目的......这只是一件有用的事情。它最显着地用于排序和其他重新排序算法。我不知道重新排序线程对象的特定原因,但我也不知道为什么这是不可能的。
【讨论】: