gpt4 book ai didi

c++ - 如何将std::function类型分配给sigevent.sigev_notify_function(POSIX计时器)

转载 作者:行者123 更新时间:2023-12-01 14:55:03 24 4
gpt4 key购买 nike

我正在使用POSIX计时器来调用使用std::function模板定义的函数:

typedef std::function<void (union sigval)> functionCbType;

在将结构sigevent的字段sigev_notify_function赋值时出现以下错误:

错误:无法在分配中将“functionCbType {aka std::function}”转换为“void()(sigval_t){aka void()(sigval)}”)
se.sigev_notify_function = callcbk;
functionCbType callcbk;
...
struct sigevent se;
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = callcbk;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);

se.sigev_notify_function期望
void       (*sigev_notify_function) (union sigval);

正确的方法是什么?

最佳答案

精心设计的C回调API可让您将值传递给回调函数。这使您可以进行状态回调。

在这种情况下,union sigvalintvoid*的并集。您应该将状态保持在这两个状态中的任何一个中。
std::function<Sig>可以存储状态,因此您需要传递该状态。
std::function不是函数指针。为了将其传递给C函数回调API,您需要对其进行包装并将其作为void*部分传递。

struct sig_cb {
void(* function)(sigval_t);
void* pvoid;
};
sig_cb make_signal_callback( std::function<void()>* pf ) {
return {
[](sigval_t v) { (*static_cast<std::function<void()>*>(v.sival_ptr))(); },
pf
};
}

然后修改您的代码:
functionCbType callcbk;
...
struct sigevent se;
auto cb = make_signal_callback(&callcbk);
se.sigev_notify = SIGEV_THREAD;
se.sigev_notify_function = cb.function;
se.sigev_value.sival_ptr = cb.pvoid;
se.sigev_notify_attributes = NULL;

int status = timer_create(CLOCK_MONOTONIC, &se, &timer_id);

它应该工作。自然,您的 std::function的生存期必须单独管理。

关于c++ - 如何将std::function类型分配给sigevent.sigev_notify_function(POSIX计时器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54214423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com