【发布时间】:2021-06-15 07:56:48
【问题描述】:
typedef void (*void_proc)(void* parameter);
void* parallel_init(void* dummy, int core_number);
int parallel_addtask(void* parallel_monitor, void_proc process, void *parameter);
int parallel_waittask(void* parallel_monitor, int task_id);
int parallel_uninit(void* parallel_monitor);
struct parallel_parameter {
int end;
int begin;
};
void process(void* parameter) {
auto p = reinterpret_cast<parallel_parameter*>(parameter);
// ur_function_name(p->begin, p-end);
}
上面是我喜欢使用的并行库(c 风格)。每次你调用它时,你都应该定义一个特定的结构参数,这太烦人了,我想实现一个模板函数来减轻调用步骤,我尝试了一些方法来实现这一点,但失败了。
template<typename _function, typename... _parameter>
int parallel_executor(_function&& function, _parameter&&... parameter) {
auto res = 0;
parallel_parameter p[8]{0};
auto body = [](void* para) -> void {
auto p = reinterpret_cast<parallel_parameter*>(para);
function(p->begin, p->end, std::forward<_parameter>(parameter)...)
};
auto parallel_handle = parallel_init(nullptr, 8);
do {
for (int i = 0;i < 8; ++i) {
res = parallel_addtask(parallel_handle, body, static_cast<void*>(&p[i]));
if (res != 0) break;
}
for (int i = 0; i < 8; ++i) {
res = parallel_waittask(parallel_handle, i);
if (res != 0) break;
}
} while (false);
parallel_uninit(parallel_handle);
return res;
}
这个调用只是简单地显示我的困境,当我使用parallel_executor时,结果session无法访问,因为我不具体捕获样式,但是当我将主体更改为以下样式时, parallel_addtask 将不接受正文函数。
auto body = [&](void* para) -> void {
auto p = reinterpret_cast<parallel_parameter*>(para);
function(p->begin, p->end, std::forward<_parameter>(parameter)...)
};
现在我处于这种尴尬的境地有一段时间了。下面是我喜欢的通话方式。
auto ret = parallel_executor(
[](int begin, int end, int parameter_1, int parameter_2) {
std::cout << begin << " ==> " << end << " ==> " << parameter_1 << std::endl;
},
100, // parameter_1
200 // parameter_2
);
关于这个问题,我希望我已经说清楚了。任何建议表示赞赏。
【问题讨论】:
-
第一个参数不是函数,所以
bind使用不正确 afaik。 Lambda 表达式生成唯一类类型的对象 -
begin和end参数从何而来?它是如何工作的?dummy是如何发挥作用的?static_cast<void*>(&p)您是否将指向在循环块范围内的堆栈上创建的结构的指针传递给并行运行的函数?!该函数是否复制数据? -
parameter的预期生命周期是多少? (你在parallel_waittask之前停下来,这对我来说似乎很可疑:/) -
@KamilCuk 是的,你是对的,我将
stack variable传递给函数,这是危险的。我编写示例代码只是为了说明我的情况,我会在空闲时间修复它。 -
@Jarod42 是的,这很危险。我会修复这个错误。