c++ - 如何将函数指针从 std::function 传递给 Linux 克隆?
问题描述
我有一个看起来像这样的类:
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 类的构造函数,巫婆将 merge_sort_thread 函数的参数 +clone()
需要int(*)(void*)
函数作为 1 个参数):
MyThread([first, center](void* arg){
return merge_sort_thread(first, center);
});
然后我尝试这段代码,它返回 SIGSEGV。我检查了 GDB,变量 ptr 等于 0x0。我该如何解决这个问题?
合并排序函数如下所示:
template<typename T>
static int merge_sort_thread(T first, T last){ // working with pointers
//sorting
}
那么主要思想是使用 MyThread 类,如 std::thread 和 lambda
std::thread([first, center](){
return merge_sort_thread(first, center);
});
解决方案
简单地说,你不能。捕获 lambda 与函数指针不兼容,fun.target<int(*)(void*)>
因此您的调用会返回一个空指针。将其传递给clone
会导致段错误。
这就是为什么clone
有一个void* args
参数将一个(指向)任意数据的参数传递给回调函数:这有效地完成了捕获的作用。如果要将自定义传递给std::function
您clone
,则需要将其包装到带有签名的函数中int(void*)
,该函数在内部将std::function
其从其void*
参数中解包并调用它。
推荐阅读
- angular - 在 ngOnInit 中调用的函数返回空
- python - 如何从 plot_roc_curve 中删除图例?
- selenium - Selenium Ide - 如何检查特定的 CSS 属性
- docker - 激活 swarm 模式后现有容器会发生什么
- c++ - 为什么我的代码一直跳过我的 c++ else 语句?
- python - 网络摄像头立即冻结opencv
- c# - 直接在 DataGrid 中插入、更新和删除行并将更改保存在数据库中
- stl - 未对齐地址内的成员访问
- python - Django:仅在实例不存在时才保存实例
- node.js - 尝试解析时未显示由扩展程序生成的 HTML