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