无法追踪 SIGEV_THREAD 使用的答案...
当将 SIGEV_THREAD 设置为 sigevent 结构中的通知方法时,假设仍然必须在 notify_function 中使用异步信号安全函数作为处理程序调用是否正确?
另外 - 假设线程以“分离”方式运行是否正确?
例如
通知线程
void my_thread(union sigval my_data)
{
// is this ok or not (two non async-signal-safe functions)?
printf("in the notify function\n");
mq_send();
}
Run Code Online (Sandbox Code Playgroud)
主功能
(...)
se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_ptr = &my_data;
se.sigev_notify_function = my_thread;
se.sigev_notify_attributes = NULL;
(...)
Run Code Online (Sandbox Code Playgroud)
如果可能,请提供参考。
不,您不需要仅使用异步信号安全函数,因为 POSIX 不会对该SIGEV_THREAD
函数施加任何此类限制。(其要点在于SIGEV_THREAD
,它可以让您在比信号处理程序更少约束的环境中处理异步通知)。
至于线程被分离,POSIX 说:
该函数应在一个环境中执行,就像它是具有由 指定的线程属性的新创建线程的 start_routine 一样
sigev_notify_attributes
。如果sigev_notify_attributes
是NULL
,则行为就像是在 detachstate 属性设置为 的情况下创建线程一样PTHREAD_CREATE_DETACHED
。为属性结构提供 detachstate 属性会PTHREAD_CREATE_JOINABLE
导致未定义的行为。该线程的信号掩码是实现定义的。
这意味着:您必须保留sigev_notify_attributes
as NULL
,或者将其设置为属性结构,并将 detachstate 设置为PTHREAD_CREATE_DETACHED
- 在这两种情况下,线程都将被创建为分离的。