我想知道为什么我们不能将对象按值传递给我们创建线程的函数。
这背后有什么合乎逻辑的原因吗?如果语言允许按值传递会有害吗?
pthread
是一个C风格的界面。为了比“传递一个整数”更灵活,它必须是一个指针。Avoid *
是在 C 中传递任意事物的最灵活的方式。在 C 中,您当然可以struct
按值传递 a,但是在编译时源函数和目标函数都需要知道哪个结构(并且每次都相同,所以我们不能struct X
在我们的一个线程和struct Y
另一个线程中使用)。
在 C++ 中,我们当然可以使用类和模板来允许将几乎任何东西传递给几乎任何类型的函数。
C++ 11std::thread
允许您使用各种 C++ 风格的东西来克服 pthread 的“C-ness”(并且根据目标系统的可用实现,使用没有 pthread 的线程)。
[这不是独有的pthreads
。OS/2 和 Windows 线程实现都将 avoid *
作为线程函数的参数]
to 的参数pthread_create
类型为指针,尽可能灵活,但这并不意味着您不能传递int
. 只需将其转换回int
. start_routine
只要传递的值参数小于指针,就可以了。
POSIX 线程是一个 C API。C 不提供复制构造函数之类的语言工具,因此无法在没有附加信息的情况下按值复制任何对象(即传入知道类型的函数,并且可以完成分配内存和复制数据的工作)。但是,该 API 会无缘无故地过于复杂。
话虽如此,您可以按值传递任何对象,只要它的大小不大于sizeof(void *)
.
由于您已将问题标记为 C++,因此 C++ 确实允许通过可变参数模板传递具有任意数量参数的函数。有关std::thread
更多详细信息,请参阅。