如何将函数指针从 std::function 传递到 Linux 克隆?
How can i pass pointer of function from std::function to Linux clone?
我有一个 class 看起来像这样:
class MyThread{
private:
pid_t pid;
size_t stack_size;
char* child_stack;
void* child_stack_end;
public:
// --methods--
MyThread(std::function<int(void*)> const& fun) {
stack_size = 1024*10;
child_stack = new char[stack_size];
child_stack_end = child_stack + stack_size;
int (*const* ptr)(void*) = fun.target<int(*)(void*)>();
pid = clone(*ptr, child_stack_end, CLONE_VM |
CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD, 0);
}
}
我想用我的 lambda 合并排序函数测试它(不是创建 MyThread class 的构造函数接受 merge_sort_thread 函数的参数 + clone()
需要 int(*)(void*)
函数作为 1 个参数):
MyThread([first, center](void* arg){
return merge_sort_thread(first, center);
});
然后我尝试使用此代码 returns SIGSEGV。
我检查了 GDB,变量 ptr 等于 0x0。
我该如何解决这个问题?
合并排序函数如下所示:
template<typename T>
static int merge_sort_thread(T first, T last){ // working with pointers
//sorting
}
嗯,主要思想是像 std::thread 和 lambda
一样使用 MyThread class
std::thread([first, center](){
return merge_sort_thread(first, center);
});
简单地说,你不能。捕获 lambda 与函数指针不兼容,因此您对 fun.target<int(*)(void*)>
的调用 returns 是一个空指针。将其传递给 clone
会导致段错误。
这就是为什么 clone
有一个 void* args
参数来将(指向)任意数据传递给回调函数:这有效地实现了捕获的作用。如果您想将自定义 std::function
传递到 clone
中,您需要将其包装到具有签名 int(void*)
的函数中,该函数在内部将 std::function
从其 [=18= 中解包] 参数并调用它。
我有一个 class 看起来像这样:
class MyThread{
private:
pid_t pid;
size_t stack_size;
char* child_stack;
void* child_stack_end;
public:
// --methods--
MyThread(std::function<int(void*)> const& fun) {
stack_size = 1024*10;
child_stack = new char[stack_size];
child_stack_end = child_stack + stack_size;
int (*const* ptr)(void*) = fun.target<int(*)(void*)>();
pid = clone(*ptr, child_stack_end, CLONE_VM |
CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD, 0);
}
}
我想用我的 lambda 合并排序函数测试它(不是创建 MyThread class 的构造函数接受 merge_sort_thread 函数的参数 + clone()
需要 int(*)(void*)
函数作为 1 个参数):
MyThread([first, center](void* arg){
return merge_sort_thread(first, center);
});
然后我尝试使用此代码 returns SIGSEGV。 我检查了 GDB,变量 ptr 等于 0x0。 我该如何解决这个问题?
合并排序函数如下所示:
template<typename T>
static int merge_sort_thread(T first, T last){ // working with pointers
//sorting
}
嗯,主要思想是像 std::thread 和 lambda
一样使用 MyThread classstd::thread([first, center](){
return merge_sort_thread(first, center);
});
简单地说,你不能。捕获 lambda 与函数指针不兼容,因此您对 fun.target<int(*)(void*)>
的调用 returns 是一个空指针。将其传递给 clone
会导致段错误。
这就是为什么 clone
有一个 void* args
参数来将(指向)任意数据传递给回调函数:这有效地实现了捕获的作用。如果您想将自定义 std::function
传递到 clone
中,您需要将其包装到具有签名 int(void*)
的函数中,该函数在内部将 std::function
从其 [=18= 中解包] 参数并调用它。