为啥c ++中线程构造函数和绑定的函数签名相同[关闭]
Posted
技术标签:
【中文标题】为啥c ++中线程构造函数和绑定的函数签名相同[关闭]【英文标题】:Why the function signature of thread constructor and bind in c++ is the same [closed]为什么c ++中线程构造函数和绑定的函数签名相同[关闭] 【发布时间】:2017-01-07 23:32:27 【问题描述】:最近在玩c++多线程的东西,线程构造函数的签名是
线程(Fn&& fn, Args&&... args)
而c++绑定函数的签名是
绑定(Fn&& fn, Args&&... args);
我不认为这是巧合,但我无法说出具体原因。谁能看到这两个功能背后的逻辑?
【问题讨论】:
它们都接收到要调用的函数和要调用它的参数。为什么它们不一样? 它们都碰巧接受了稍后会调用的函数。这绝对是巧合。 我最近注意到std::sinf
和std::cosf
具有相同的签名。我不认为这是巧合,有人能看出其中的逻辑吗?
【参考方案1】:
让我们考虑一下这些东西的作用:
线程将参数绑定到一个函数(函数的所有参数),并立即启动一个线程,执行绑定的函数。
将绑定个参数绑定到一个函数(不一定是所有参数),并返回一个可以稍后执行的更少或相等数量的函子。
所以,线程的 API 结合了参数的绑定,以及绑定的结果在一个新线程中的执行。由于参数的绑定是创建线程的初始部分,因此参数的绑定和线程的创建恰好具有相似甚至相同的签名也就不足为奇了。这是所选 API 方法的结果。
这不是唯一的选择。另一种设计可能是接受一个空函子。然后,用户必须显式绑定参数来创建一个空函子来创建一个线程。选择在新线程中结合绑定和执行的方法需要用户编写更少的样板。
【讨论】:
不确定关于 arity 的那一点。可以使用许多参数调用绑定表达式。 @KerrekSB 我并不是说你不能用很多参数调用绑定。如果你将一个参数绑定到一个三元函数,你会得到一个二元函子。如果你绑定三个参数,你会得到一个空函子。等等。每个绑定参数将元数减少一个。我的回答中是否有你认为矛盾的部分? 如果您可以使用 != n 参数调用它,我不确定您是否可以“获得一个 n 元函子”...无论如何,bind
也有 占位符 它允许你构造任意“arity”的函子(在你的意义上),所以我认为“lesser arity”并不是我会做出的一般性陈述。
是的,占位符的数量决定了结果函子的数量(绑定表达式)。实际上,您当然可以使用所有占位符,因此“次要数量”并不严格。我现在澄清了。
@KerrekSB 我查看了bind,显然,您可以使用比占位符更多的参数调用绑定表达式,并且这些额外的参数将被丢弃。这就是你所说的作为没有较少数量的表达式的论据吗?我想那是正确的,但我不确定如何在保持技术正确的同时表达我的意思。【参考方案2】:
逻辑如下:一个函数构造一个线程计算,调用一个可调用对象完美转发 arg 值,而另一个函数创建一个部分函数应用程序或部分,或者在一种情况下作为特殊重载,函数组合.
【讨论】:
以上是关于为啥c ++中线程构造函数和绑定的函数签名相同[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
请教一下C#中父类静态构造函数在子类中为啥不会和子类的静态构造函数一起执行