【问题标题】:Trying to cast integer to void to pass to pthread function by value试图将整数转换为 void 以按值传递给 pthread 函数
【发布时间】:2014-05-03 21:16:11
【问题描述】:

我正在尝试(使用 pthread_create)将值传递给函数:

void philosopher(int);

我只需要一种方法来区分每个线程。它们运行的​​顺序无关紧要(显然,因为它们是线程),甚至它们创建的顺序也无关紧要,但它们需要包含至少一个差异,以便我可以区分它们之间的差异。这样做的原因是,在函数中,每个线程都需要将自己称为“哲学家 1,哲学家 2,......”。哲学家的数量是动态的(用户在运行程序时将其作为参数传递)。

pthread_t threads[philo];

for (int i = 0; i < philo; i++)
    pthread_create(&threads[i], NULL, &philosopher, reinterpret_cast<void*>(i));

我从上面的代码中得到一个错误:“来自'void (*)(int)’ to ‘void* (*)(void*)'[-fpermissive]的无效转换。显然,我需要按值传递i(因为我在for循环中发生了变化)。我被困在编译但是,只有在最后一个值为 NULL 时才能编译我的 pthread 程序。我也尝试过:

pthread_create(&threads[i],  NULL,  &philosopher,  i);

pthread_create(&threads[i],  NULL,  &philosopher,  (void*)i);

两者都会产生相同的编译器错误。

【问题讨论】:

  • 您的编译器是否支持 C++11 线程?在 C++11 中使用线程要容易得多。
  • 我如何检查这个?我在 fedora rpm 存储库中有 gnu 编译器。
  • 如果 philo 是动态的,那么您的代码不是有效的 C++。
  • 线程例程必须有原型extern "C" void* philosopher(void*)
  • @Deduplicator:很好,我可以偷那个吗?

标签: c++ c multithreading pthreads typecasting-operator


【解决方案1】:

您遇到的参数与您想象的不同 - 问题出在线程函数上。

它应该采用 void * - 而不是 int - 并返回 void *,所以将其更改为

void* philosopher(void*);

philosopher 函数中,您将参数转换回int

(不要强制转换函数 - 这是未定义的。)

【讨论】:

    【解决方案2】:

    错误信息很清楚。你需要一个void * (void *) 类型的函数,并且你有一个void (int) 类型的函数。修复它:

    extern "C"
    void * philosopher(void * data)
    {
        uintptr_t n = reinterpret_cast<uintptr_t>(data);
    
        // ...
    
        return nullptr;
    }
    

    (正如@Deduplicator 所说,严格来说pthread_create 要求线程函数具有C 链接,因此在C++ 中您需要将其声明为extern "C"。)

    【讨论】:

    • uintptr_t 类型是什么?我的编译器无法识别它。
    • @jaredad7:见this question。您需要包含适当的标题。
    • 好的,现在可以正常编译了。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2011-12-11
    • 2013-11-26
    • 2013-10-11
    • 2021-12-04
    • 1970-01-01
    • 2011-02-09
    • 2013-10-19
    相关资源
    最近更新 更多