无法追踪对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;
(...)
如果可能,请提供参考。
答案 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
- 在这两种情况下,线程都将被分离创建。