pthreads SIGEV_THREAD 和异步安全函数调用

tre*_*ger 5 signals pthreads

无法追踪 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)

如果可能,请提供参考。

caf*_*caf 4

不,您不需要仅使用异步信号安全函数,因为 POSIX 不会对该SIGEV_THREAD函数施加任何此类限制。(其要点在于SIGEV_THREAD,它可以让您在比信号处理程序更少约束的环境中处理异步通知)。

至于线程被分离,POSIX 说:

该函数应在一个环境中执行,就像它是具有由 指定的线程属性的新创建线程的 start_routine 一样sigev_notify_attributes。如果sigev_notify_attributesNULL,则行为就像是在 detachstate 属性设置为 的情况下创建线程一样PTHREAD_CREATE_DETACHED。为属性结构提供 detachstate 属性会 PTHREAD_CREATE_JOINABLE导致未定义的行为。该线程的信号掩码是实现定义的。

这意味着:您必须保留sigev_notify_attributesas NULL,或者将其设置为属性结构,并将 detachstate 设置为PTHREAD_CREATE_DETACHED- 在这两种情况下,线程都将被创建为分离的。