【发布时间】: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