pthreads SIGEV_THREAD和异步安全函数调用

时间:2015-06-11 14:13:12

标签: pthreads signals

无法追踪对SIGEV_THREAD ...

的使用情况的回答

当在sigevent结构中将SIGEV_THREAD设置为notify方法时,假设仍然必须在notify_function中使用async-signal-safe函数作为处理程序调用是否正确?

另外 - 假设线程以“分离”的形式运行是正确的吗?

例如

通知线程

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();
}

主要功能

(...)
se.sigev_notify = SIGEV_THREAD;
se.sigev_value.sival_ptr = &my_data;
se.sigev_notify_function = my_thread;
se.sigev_notify_attributes = NULL;
(...)

如果可能,请提供参考。

1 个答案:

答案 0 :(得分:4)

不,您不需要仅使用异步信号安全功能,因为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保留为NULL,或将其设置为属性结构,并将detachstate设置为PTHREAD_CREATE_DETACHED - 在这两种情况下,线程都将被分离创建。