POSIX线程/信号:用于确定信号传递到哪个线程的便携方式?

Ste*_*Dan 8 c multithreading posix signals

我有一个多线程服务器(使用POSIX线程),每个持久连接有一个线程.在其中一个线程中,连接的另一端关闭,导致交付SIGPIPE.是否有一个(最好是可移植的)确定发生了哪个线程(以及哪个连接)因此我可以让我的信号处理程序执行线程/连接清理工作本身或设置一个标志,以便主线程和工作线程分别看到他们需要以后再做吗?

编辑:我想知道我是否可以使用&errno,将其存储在全局数组中并将其与服务器的线程标识符关联,然后在信号处理程序中搜索&errno.线程的特定错误是否对信号处理程序可见?我是否理解线程安全errno即使在球场中如何工作?

Jer*_*ner 12

我不这么认为,不.对多线程服务器更好的解决方案是抑制SIGPIPE信号(通过调用signal(SIGPIPE, SIG_IGN)作为程序启动例程的一部分),然后让线程处理由返回的错误值(-1/EPIPE)send().

信号和多线程不能很好地混合.

  • 这是正确的 - *所有*网络服务器,而不仅仅是多线程服务器,应该忽略`SIGPIPE`并处理'EPIPE`.@SteelyDan:`SIGPIPE`将不会比'EPIPE`更快地传递 - 信号仅在"EPIPE"返回的同时生成. (4认同)