我目前遇到与使用 pthread.h 相关的问题(因为我对它还很陌生),所以我真的希望我能从这个论坛获得一些帮助。假设我想将此函数传递给线程这是用 pthread.h 创建的:
void test (long int begin, long int end, vector<long int> x)
{
/*do something*/
}
您知道如何将此函数及其所有参数包含到该线程中吗? 或者我什至可以将其传递到 pthread 中吗??
我可以同时将具有多个参数的多个函数传递到 pthread 中吗? 非常感谢您的任何帮助,thx
假设我想将此函数传递给创建的线程 与 pthread.h :
void test (long int begin, long int end, vector<long int> x) { /*do something*/ }
那么我们假设你不走运。 pthreads 线程的入口点函数必须具有签名
void *f(void *)
。
你知道如何将此函数与 它的所有论点?或者我什至可以将其传递到 pthread 中吗??
这是不可能做到的这样。但请参阅下文。
我是否能够传递具有多个参数的多个函数 同时进入pthread?
没有。
但是你不需要这样做。与
std::thread
相比,pthreads 接口有些尴尬,但是单个 void
指针参数足以满足任何参数集合和任何函数序列。只需创建一个包含适当成员的结构/类,并将指针传递给实例(转换为void *
)。然后线程函数提取数据,并调用所需的任何函数。
例如,
struct thread_args {
long int begin;
long int end;
vector<long int> x;
};
void test (long int begin, long int end, vector<long int> x);
void *test_wrapper(void *data) {
thread_args *args_ptr = static_cast<thread_args *>(data);
test(args_ptr->begin, args_ptr->end, args_ptr->x);
// ...
return nullptr;
}
// ...
thread_args args{ begin, end, x };
pthread_t thread_id;
int result = pthread_create(&thread_id, NULL, test_wrapper, &args);
// ...
请注意,确保参数对象的生命周期在线程完成之前不会结束非常重要。这通常是通过在对象超出范围之前加入线程以 RAII 方式完成的,或者通过动态分配对象并赋予线程函数释放它的责任。
确保参数对象不会被意外修改也很重要——例如,使用相同的参数对象在循环中启动多个线程,并修改每个线程的对象。