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