将线程函数声明为返回void和void *之间是否存在差异?

时间:2017-10-15 20:51:33

标签: c++ multithreading function pointers void

void声明为void*std::thread之间是否有区别?

void encrypt(/*parameters*/)
{
}

// ...

std::thread(encrypt, /*arguments*/);

我刚刚阅读了有关在互联网上使用void*线程的内容,并希望确保我使用void而不是void*是有充分理由的。我一般都在强调我写的东西太多了。

1 个答案:

答案 0 :(得分:5)

是的。例如这个函数:

void func() {  }

状态良好。另一方面,这一个:

void* func() {  }

违反语言限制,并且格式不正确。区别?您不能省略return语句,否则您的程序将有未定义的行为。

在这种情况下,

void指定缺少返回类型,但void*是完整类型,因此您必须为要返回的函数指定值。

std::thread的上下文中,您应将其指定为void。无论如何,任何返回值都会被忽略,所以只需保持程序的良好形成,而不是为了它而返回一些毫无意义的东西。

如果您在线阅读有关Pthreads的信息,那么他们期待一个接受并返回void*的回调。这样他们就可以支持任何参数任何返回类型。但那是一个C API,所以必须这样做。 std中的惯用C ++ API是类型感知的。所以void就是这样。如果您关心返回值,请查看std::future