【问题标题】:C++ - Is there a difference between declaring a function's return value as void/void* when used in a thread?C++ - 在线程中使用时将函数的返回值声明为 void/void* 有区别吗?
【发布时间】:2017-10-15 20:51:32
【问题描述】:

将函数的返回值声明为 void/void* 与 std::thread 一起使用是否有区别?

void encrypt(/*arguments*/)
{
}

// ...

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

我阅读了一些关于在使用线程时使用 void* 的信息,因此我想确保我使用的是 void 而不是 void*,这是有充分理由的。

【问题讨论】:

  • 哦,好吧,我猜这个问题是个错误。 ¯\_(ツ)_/¯
  • 我建议反对者阅读问题而不仅仅是标题。

标签: c++ multithreading function pointers void


【解决方案1】:

是的,有。比如这个函数:

void func() {  }

结构良好。另一方面,这个:

void* func() {  }

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

void 在这种情况下指定缺少返回类型,但void* 是完整类型,因此您必须为要返回的函数指定一个值。

std::thread 的上下文中,您应该将其指定为void。无论如何,任何返回值都会被忽略,所以只要保持程序的格式正确,不要仅仅为了它而返回无意义的东西。

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

【讨论】:

  • 谢谢!没想到这个问题会触发这么多人。
  • @TypicalHog - 实际上一点也不差。我假设您熟悉pthreads,CB 应该返回void*
  • 我不是,我只是在互联网上阅读了一些关于在线程中使用 void* 的内容,并想确保我使用的是 void 而不是 void* 是有原因的。我通常对我写的所有东西都感到压力太大。
  • @TypicalHog - 哦,好吧。 Pthreads 接受并返回void* 以支持任何参数任何返回类型。但这是一个 C API,所以它必须这样做。 std 中的惯用 C++ API 更能识别类型。所以void 是。如果您确实关心返回值,请查看std::future
猜你喜欢
  • 2012-07-01
  • 2013-06-26
  • 2016-08-28
  • 2017-07-13
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 2014-02-19
  • 2012-10-17
相关资源
最近更新 更多