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
成员函数。
这很有用,因为您可以,例如,sort
和 vector
的 thread
s。排序算法将使用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 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章
解决添加swagger后项目报错 Failed to start bean 'documentationPluginsBootstrapper'