std::thread::swap 的目的是啥?

Posted

技术标签:

【中文标题】std::thread::swap 的目的是啥?【英文标题】:What is the purpose of std::thread::swap?std::thread::swap 的目的是什么? 【发布时间】:2020-02-20 18:24:04 【问题描述】:

据我了解,std::thread::swap 交换了两个线程的线程 ID。它不会以任何方式更改线程本地存储或影响任何一个线程的执行。其背后的目的是什么?如何/在哪里/为什么使用它?

【问题讨论】:

除了线程 ID 的所有者之外,std::thread 是什么? 【参考方案1】:

不要认为是“交换两个线程的线程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 成员函数。

这很有用,因为您可以,例如,sortvectorthreads。排序算法将使用swap 重新排列向量中的线程。请记住,在 C++ 中不能移动对象,只能移动它们的内容。 swap 和移动语义,允许您将大多数对象的内容移动到不同的对象中。对于thread,它将“指针”移动到线程。

【讨论】:

查看Copy and Swap idiom 了解另一个有用的情况。 "...我不知道他们为什么还要创建...." :创建一个成员函数(因为私有状态需要),专门std::swap使用成员函数。现在线程可以使用std::swap进行一般交换 @RichardCritten 线程也可以在没有成员函数的情况下使用std::swap 进行交换。成员函数的原因是它可以比通用的std::swap 更有效。 @RichardCritten friend 存在并且通常用于此类事情。【参考方案2】:

std::thread 是内部引用类型 - 类似于 std::vector 的方式。在内部,std::vector 也只是指存储在动态内存中的内存缓冲区。

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

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

【讨论】:

以上是关于std::thread::swap 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中三目运算符是啥?

百练3723:围棋

Docker,它是啥,目的是啥

解决添加swagger后项目报错 Failed to start bean 'documentationPluginsBootstrapper'

04:围棋

不锈钢网目数的区别