代码之家  ›  专栏  ›  技术社区  ›  Benubird

C信号处理程序拼图中的竞争条件

  •  6
  • Benubird  · 技术社区  · 14 年前

    问题是,如果我接收到一个信号,并启动处理程序,但随后被另一个信号中断。这(据我所知)触发了信号处理程序的新执行,它将在同一个全局数据集上操作-不允许!

    我不能使用锁,因为如果第一个处理程序调用被中断,它自然不会释放锁供中断处理程序获取。那么,我该怎么做呢?知道吗?

    4 回复  |  直到 14 年前
        1
  •  1
  •   Nate    14 年前

    如果您有幸在多线程环境中工作,最好的方法之一是让全局链接列表由单独的线程独占控制。中断会将请求排队到这个线程(例如,通过简单地传递一个指针,可以很快地执行某些操作),然后线程会按程序遍历每个请求并修改链接列表。这允许无锁执行。

    当然,你必须依赖你的操作系统的消息传递垃圾,所以这可能不是一个选择。

        2
  •  1
  •   qrdl    14 年前

    sa_mask 领域 struct sigaction sigaction() 系统调用。

        3
  •  1
  •   jcomeau_ictx    14 年前

    http://users.evtek.fi/~tk/rtp/signals-programming.html

    保证完全没有竞争的方法是让系统在调用信号处理程序之前为我们设置信号屏蔽。如果我们使用sigaction()系统调用来定义执行处理程序时要使用的信号处理程序函数和信号掩码,则可以完成此操作。现在您已经熟悉了信号处理的各种概念,您可能可以自己阅读sigaction()的手册页了。但是,在旧系统上,您找不到这个系统调用,但是您仍然可以找到sigvec()调用,它启用了类似的功能。

        4
  •  0
  •   Sim Sun    14 年前

    我认为你应该把信号按顺序排列,就像工作队列一样