试图将整型转换为void以按值传递给pthread函数
Trying to cast integer to void to pass to pthread function by value
我正在尝试(使用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"
)
相关文章:
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- C++类 - 初始化列表 - 递归 - 按值传递
- 将函数参数完美转发到函数指针:按值传递呢?
- 棘手的按值传递和按引用递归问题传递
- 不同于按值传递和常量引用传递的程序集
- 按值传递变量与按引用传递变量具有相同的结果
- 为什么按值传递QStringView比引用常量更快?
- 获取 std::函数以推断按引用传递/按值传递
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- 防止在按值传递对象(继承)时进行切片
- 按值传递类和结构
- C++按引用传递还是按值传递?
- 为什么在按值返回时创建临时对象,而不是在按值传递给函数参数时创建临时对象
- 可移动但不可复制的对象:按值传递还是按引用传递?
- const-ref传递的模板化参数是否经过优化,以便在足够小时按值传递
- 在C++中指针是按值传递的吗
- shared_ptr构造函数参数是否应按值传递
- 使用 std::move 将参数传递给函数,如果该参数声明为按值传递或使用移动操作数 &&,是否有区别?