linux 多线程信号处理总结

linux 多线程信号处理总结,第1张

APUE的说法:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有的线程共享的,这意味着尽管单个线程可以阻止某些信号,但当线程修改了与某个信号相关的处理行为后,所有的线程都共享这个处理行为的改变。这样如果一个线程选择忽略某个信号,而其他线程可以恢复信号的默认处理行为,或者为信号设置一个新的处理程序,从而可以撤销上述线程的信号选择。

进程中的信号是送到单个线程的,如果信号与硬件故障或者计时器超时有关,该型号就被发送到引起该事件的线程中去,而其他的信号则被发送到任意一个线程。

sigprocmask的行为在多线程的进程中没有定义,线程必须使用pthread_sigmask

总结:一个信号可以被没屏蔽它的任何一个线程处理,但是在一个进程内只有一个多个线程共用的处理函数。......

转自: http://blog.chinaunix.net/uid-12274566-id-3050955.html

这个应该和标准I/O里面的缓冲有关。

记得缓冲区的大小好像是4K忘记是不是了,你那程序没有+‘\n’是全缓冲类型,

需要把整个缓冲区填满系统才会把数据刷新到屏幕,再+上你每次都睡眠一秒,

并不是卡住了只是需要把缓冲区添满的时间太长,你让它放在那里等足够长的时间他才会

输出数据,不过时间可能要很长很长。

你把sleep(1)删掉后,因为每次不用等待一秒,而CPU运转的时间非常快,所以数据马上就

显示出来了。

而+上‘\n’缓冲区的类型就变成了行缓冲这时就变成每次输出一行,也就是每次输出一个

1或者一个2.

解决方法如下:

这个问题是由于访问内存错误造成的,例如一次时因为循环越界,导致访问界外内存时出现过此种问题。

2、程序卡死的问题,就是程序的进程还在,但是却卡在那里什么都不做,该问题可能也是内存访问越界造成的;

另外还可能是多线程中混合使用C和C++的函数造成,例如:某些嵌入式linux平台对C++支持的不好,这时候如果在多线程中混合使用printf和cout,就会造成此问题。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8738686.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-20
下一篇 2023-04-20

发表评论

登录后才能评论

评论列表(0条)

保存