您当前位置: 首页 » [linux总结] » unix编程环境学习 » 【linux开发】semop执行出现EINTR错误

【linux开发】semop执行出现EINTR错误

2020-10-20 |

用信号量来做共享内存的互斥操作,执行semop阻塞式调用。

结果发现执行p操作(加锁)会较低概率不定期的出现EINTR失败,查看linux手册,看到如下片段:

也就是当线程正在对信号量进行操作时,刚好出现该线程捕捉到了一个信号,这时候刚好接收到某个信号执行了相应信号的相应中断处理函数。

这主要是由于信号是以进程为单位,而具体某个信号会被进程内部的哪一个线程执行,这是极有可能不可预知的(主要有操作系统而定)。因此在这种情况下时,如果semop执行出现了一个EINTR错误,那么只需要再次重启调用semop就好。

解决这个问题的办法有两个:

1,通过屏蔽掉大部分该线程不关心的信号来解决,但是这样有可能会出现误屏蔽的操作情况。

2,单独开启一个线程来执行sigwait,作为信号处理线程。