试图将整型转换为void以按值传递给pthread函数

Trying to cast integer to void to pass to pthread function by value

本文关键字:按值传递 pthread 函数 void 整型 转换      更新时间:2023-10-16

我正在尝试(使用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(因为I在for循环中发生了变化)。但是,我被困在编译时,并且只有在最后一个值为NULL时才能让我的pthread程序编译。我也试过:

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

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

你有一个不同的参数的问题,这是线程函数的问题。

它应该取void * -不是int -并返回void *,因此将其更改为

void* philosopher(void*);

,在philosopher函数内部,将参数强制转换回int

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

错误消息非常清楚。您需要一个类型为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")