pthread_create:按值传递参数

时间:2013-06-13 15:14:23

标签: c++ c pthreads

我想知道为什么我们不能通过值将对象传递给我们创建线程的函数。

背后有合理的理由吗? 如果语言允许通过值传递会不会有害?

3 个答案:

答案 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即可。 只要传递的值参数小于指针,就应该没问题。