多线程信号问题的请教

Caballeroo 2009-07-24 01:27:09
要是在一个拥有多个线程的进程(线程1,2,3)中,其中线程2,3中分别读串口和网口的数据并进行处理,

要是把两个设备都设置成信号异步驱动的形式,即当网口和串口有数据达到时,调用信号处理函数进行相应工作。


这样有一个问题:因为线程2.3中都不能屏蔽信号SIGIO,那样的话要是串口有数据到达,有可能执行的是网口的信号处理函

数,,,,而网口有数据到达时执行了串口的信号处理函数,,,,

这个问题怎么解决?
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wolf0403 2009-07-25
  • 打赏
  • 举报
回复
信号驱动 I/O 本来就不适合有多个句柄需要读写的情况吧?
如果两个都是标准文件句柄,可以用 open write read 这些的,看看能不能改用 select / epoll 模型?
晨星 2009-07-24
  • 打赏
  • 举报
回复
我一般都在这儿看:
linux.die.net
呵呵。
Caballeroo 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 steedhorse 的回复:]
引用 4 楼 caballeroo 的回复:
我有个问题请教steedhorse,,,,  关于sigsuspend函数的返回问题:

当两个线程1,2均没有屏蔽某一信号,线程2中调用sigsuspend等待信号处理函数返回。如果原本想让线程2执行信号处理函数,但假设当信号达到时线程1执行了信号处理函数,那样的话信号处理函数执行结束后,,线程2中的sigsuspend函数会返回码?


我觉得不会,就跟其它那些可能被打断并将错误码置为EINTR的阻塞系统调用(比如sleep,waitpid等等等等)一样,哪个线程被信号打断了,哪个线程中的阻塞操作就会提前返回。
但我并不确定,因为LINUX的API文档中,对于sigsuspend在多个pthread情况下的表现只字未提。
[/Quote]


我也觉得不会,其实我也不太肯定


昨天的做了一个实验就是线程2一直没有返回,但不知道实验是否正确



Linux API 文档是指的那个?能不能给个链接
晨星 2009-07-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 caballeroo 的回复:]
我有个问题请教steedhorse,,,,  关于sigsuspend函数的返回问题:

当两个线程1,2均没有屏蔽某一信号,线程2中调用sigsuspend等待信号处理函数返回。如果原本想让线程2执行信号处理函数,但假设当信号达到时线程1执行了信号处理函数,那样的话信号处理函数执行结束后,,线程2中的sigsuspend函数会返回码?

[/Quote]
我觉得不会,就跟其它那些可能被打断并将错误码置为EINTR的阻塞系统调用(比如sleep,waitpid等等等等)一样,哪个线程被信号打断了,哪个线程中的阻塞操作就会提前返回。
但我并不确定,因为LINUX的API文档中,对于sigsuspend在多个pthread情况下的表现只字未提。
yylklshmyt20090217 2009-07-24
  • 打赏
  • 举报
回复
线程2,3中分别读串口和网口的数据并进行处理,

2,3线程可以不可以换成在 主程序中实行多路转接,转接之后再创建线程去读取数据并进行处理
这样 就避免了信号的问题
Caballeroo 2009-07-24
  • 打赏
  • 举报
回复
我有个问题请教steedhorse,,,, 关于sigsuspend函数的返回问题:

当两个线程1,2均没有屏蔽某一信号,线程2中调用sigsuspend等待信号处理函数返回。如果原本想让线程2执行信号处理函数,但假设当信号达到时线程1执行了信号处理函数,那样的话信号处理函数执行结束后,,线程2中的sigsuspend函数会返回码?
晨星 2009-07-24
  • 打赏
  • 举报
回复
我只是举个例子。
其实我啥也没说,呵呵,这个问题我是想不到直接的解决办法的,于是只好想办法绕开了。
我是想让三个线程合作,一个线程负责监听信号,另外两个线程处理数据。处理数据的线程屏蔽掉SIGIO
一旦有信号到来,监听信号的线程就把信号信息暂存到一个队列中,然后能过某种方式通知处理处据的线程。
Caballeroo 2009-07-24
  • 打赏
  • 举报
回复
steedhorse大哥,能不能详细说明一下,小弟感激不尽!
晨星 2009-07-24
  • 打赏
  • 举报
回复
同一种信号最好只让一个线程处理。
但“处理”不一定是全部处理到底,所谓“处理”只是响应一下就可以了。比如让信号排一下队,然后再分派给不同的线程继续处理就可以了。

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧