2015-06-11 34 views
4

遇到问题的答案追查到SIGEV_THREAD的使用...并行线程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(); 
} 

主要功能

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

如果可能的话请提供一个参考。

+0

“* asynch-save *”的意思是“* asnch-signal-save *”?如果是:No. – alk

+0

@alk - 你有什么参考? –

+0

请参阅下面的* caf *的答案。 – alk

回答

3

不,您不需要仅使用异步信号安全功能,因为POSIX不会在SIGEV_THREAD函数上设置任何此类限制。 (整个SIGEV_THREAD的要点是,它可以让你在比信号处理程序更不受限制的环境中处理异步通知)。

至于脱离线程,POSIX说:

功能必须在环境好像它是 的start_routine与线程新创建的线程的属性由sigev_notify_attributes指定 执行。如果sigev_notify_attributesNULL,则行为应该如同使用 将detachstate属性设置为PTHREAD_CREATE_DETACHED创建线程一样。提供 属性结构的detachstate属性为 PTHREAD_CREATE_JOINABLE会导致未定义的行为。该线程的掩码是实现定义的。

这意味着:您必须离开sigev_notify_attributes作为NULL,或者将其设置为一个属性结构设置为PTHREAD_CREATE_DETACHED的detachstate - 在这两种情况下,该线程将被创建分离。

+0

为了完整:上面的答案中的引用来自http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_02(最后一段) – alk

+0

谢谢 - 我想我认为规范会明确声明异步信号安全功能,因为它对该标准的其他功能非常具体。另外 - 手册页的评论引起了我对“安全性”的质疑。通过调用sigev_notify_function“通知进程”,好像“它是新线程的启动函数”。 –

+0

@ user3618690:“好像”在那里,因为线程并不一定在事件发生时实际启动 - 实现可以让线程预先启动并等待某个事件,然后调用“ sigev_notify_function'。 – caf