c++ - 尝试将整数强制转换为 void 以按值传递给 pthread 函数

标签 c++ c multithreading pthreads typecasting-operator

我正在尝试(使用 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循环中发生变化)。我陷入了编译阶段然而,我的 pthread 程序只能在最后一个值为 NULL 时才能编译。我也尝试过:

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

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

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

最佳答案

您遇到的问题与您想象的不同 - 这是线程函数的问题。

它应该接受一个 void * - 而不是 int - 并返回一个 void *,所以将其更改为

void* philosopher(void*);

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

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

关于c++ - 尝试将整数强制转换为 void 以按值传递给 pthread 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23449912/

相关文章:

c++ - 循环根本不应该运行,但它运行无限次

c++ - 我有一个.pdf文件,如何将其页面呈现为RGB图像?

java - MIDP 应用程序,被 Connector.Open(..) 阻止

java - += 运算符在 Java 中是线程安全的吗?

c - 我的这个推理哪里错了?

java - 在 Java 中使用 Thread.yield()

C++ 滥用字符串连接

c++ - 段错误错误 C++

c++ - 哪个递归函数会占用更少的内存?

c - 编译器在赋值操作期间如何工作?