【问题标题】:Differences between Pthread in C vs C++C 与 C++ 中的 Pthread 之间的差异
【发布时间】:2016-12-17 06:56:13
【问题描述】:

所以我能够使用 Ada_function'Address 将 Ada 函数传递给 C_function。这是 C 函数:

void Create_Process(int * status, void * function) {
    pthread_t new_thread;

    //creating function with the given function and no arguments.
    *status = pthread_create(&new_thread, NULL, function, NULL);
}

这工作得很好。我的问题是当我尝试在 C++ 中使用相同的函数时。编译失败并出现错误:

error: invalid conversion from ‘void*’ to ‘void* (*)(void*)’ [-fpermissive]
*status = pthread_create(&new_thread, NULL, function, NULL);

有什么理由可以在 C 中工作/编译而不是在 C++ 中?

【问题讨论】:

  • 可能是因为 C 和 C++ 是不同的语言?相同的语法并不意味着相同的语义。
  • 您不应将指向函数的指针视为指向对象的指针——即使在 C 语言中也不保证它们的大小相同(尽管它们通常大小相同)。 C++ 对这些问题比较挑剔。您必须将void * 显式转换为所需的类型,而C 会随意为您执行此操作——C++ 程序员有时对C 持怀疑态度的原因之一。简而言之,有很多 C 代码不是有效的 C++ 代码;您的函数就是此类代码的一个示例。
  • 您的 C 函数似乎并没有比直接使用 pthread_create() 增加任何价值。实际上,您丢失了线程 ID pthread_t
  • @SimonWright 是的,我知道。其余的功能并不完全相同。这更多是为了清楚起见。
  • 出于好奇,将地址传递给 Ada 函数到 pthread 中而不是使用原生 Ada 线程(任务)有什么意义?

标签: c++ c pthreads posix ada


【解决方案1】:

C++ 中的隐式类型转换比 C 中严格得多。void * function 参数不能用作 C++ 或 C 中的函数指针...

你的函数原型中需要void* (*function)(void*)

【讨论】:

    【解决方案2】:

    正如KIIV 所述,C++ 中的隐式类型转换比 C 中的要严格得多。

    void* (*function) (void*)

    这是一个指向函数的指针,该函数接受一个void* 参数并返回void*

    要消除 C++ 中的错误,请将函数更改为返回 void *,并在不进行类型转换的情况下传递它。如果您不关心值,则线程函数的返回可以是简单的返回NULL

    直接从 C++ 使用这个 C 库还有其他各种问题;特别是为了可移植性,线程入口函数应该是extern "C"。好的做法应该是使用标准 C++ 线程库(或 Boost 的实现,如果您坚持使用该语言的 2011 之前版本)。

    【讨论】:

    • 当我只有从 Ada 传入的函数的地址(指针)时,我将如何创建一个使用 c++ 标准线程库运行函数的线程?
    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多