pthread_create:按值传递参数

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

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

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 *作为线程函数的参数]

POSIX线程是一个C API。 C不提供像复制构造函数这样的语言工具,因此无法在没有附加信息的情况下按值复制任何对象(即传入知道该类型的函数并且可以执行分配内存和复制数据的工作)。 但是,由于没有充分的理由,该API将过于复杂。

话虽如此,只要其大小不大于sizeof(void *) ,您就可以按值传递任何对象。

由于您已将问题标记为C ++,因此C ++允许通过可变参数模板传递具有任意数量参数的函数。 有关更多详细信息,请参阅std::thread

pthread_create的参数被输入为指针,尽可能灵活,但这并不意味着你不能传递int 。 只需将其start_routinestart_routineint 。 只要传递的值参数小于指针,就应该没问题。