- 浏览: 146454 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lyaqys:
lz实现的OptimisticExclusiveLock有点问 ...
java park/unpark 【java并发】基于JUC CAS原理,自己实现简单独占锁
原文:http://blog.chinaunix.net/uid-23629988-id-199153.html
今天帮助同事调试一个问题,最终确定是在多线程下使用sigwait引发的。
该线程大致流程如下:
void thread(void *data)
{
int wait_sig = *(int*)data;
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, wait_ig);
while (1) {
int signal;
if (0 != sigwait(&sigset, &signal)) {
break;
}
}
}
出现的问题是这个断言失败,也就是说sigwait失败了。后来打印出sigwait的返回值,发现sigwait的失败的原因时EINTR,也就说 sigwait被一个信号中断了,但是不知道信号来自何处。说到此处,先说明一下,sigwait这个函数很奇怪,跟一般的linux API不同。sigwait出错的时候,并不设置errno,而直接把errno错误值返回。
通过增加一个新的判断
int ret = sigwait(&sigset, &signal));
if (EINTR == ret) {
continue;
}
else if (ret) {
break;
}
毕竟sigwait作为一个阻塞操作,因为收到信号而失败,是可以接受的行为,所以要对EINTR进行特殊处理。
加上这一句后,发现原来在另外一个线程有一个非法内存错误,所以产生了一个SIGSEGV信号。到此,虽然这个问题是由于这个内存问题引起的,但是实际上从这个问题的现象上看,在多线程下使用sigwait容易引起一些问题。
1.在POSIX标准中,当进程收到信号时,如果是多线程的情况,我们是无法确定是哪一个线程处理这个信号。而sigwait是从进程中pending的信号中,取走指定的信号。这样的话,如果要确保sigwait这个线程收到该信号,那么所有线程含主线程以及这个sigwait线程则必须block住这个信号。否则如果在两次sigwait之间,收到了指定信号,该信号很有可能被任意一个线程处理掉。
2.sigwait的名字以及在man中的介绍容易引起人的误解。
1)sigwait,从名字上看只等待指定信号集。这样很容易让人感觉除指定信号外,其他信号不会促使sigwait的返回;
2)来看看man中的说明The sigwait() function suspends execution of the calling thread until the delivery of one of the signals specified in the signal set set.这里也说了,sigwait会一直suspend直到指定信号发生。另外,man中的errors说明也容易引起误解。man中只有一个错误,就是EINVAL,给人感觉sigwait不会被信号中断。
ERRORS
EINVAL set contains an invalid signal number.
(我的系统是FC12)
但是按照我一直以来的经验,基本上所有的阻塞操作都会被信号中断,除非设置了RESTART标志。所有我建议同事加了以上的代码。
后来看到man中还有这么一句,
NOTES
sigwait() is implemented using sigtimedwait(2).
于是又查看了sigtimedwait。发现sigtimedwait的手册还是比较完整的。
ERRORS
EAGAIN No signal in set was delivered within the timeout period specified to sigtimedwait().
EINTR The wait was interrupted by a signal handler; see signal(7). (This handler was for a signal other than one of those in set.)
EINVAL timeout was invalid.
其实这次的代码是一个开源工具的代码,它使用信号机制作为多线程的通讯工具。个人感觉这种实现并不合适。因为在它的代码中,并没有在所有的线程中屏蔽掉需要sigwait的信号,另外该工具会产生多个线程,每个线程需要sigwait的信号是不同的。按照上面的代码,实际上它只是通过sigwait等到相应的信号来唤醒该线程,那么还不如使用pthread_cond_wait来代替sigwait呢。
今天帮助同事调试一个问题,最终确定是在多线程下使用sigwait引发的。
该线程大致流程如下:
void thread(void *data)
{
int wait_sig = *(int*)data;
sigset_t sigset;
sigemptyset(&sigset);
sigaddset(&sigset, wait_ig);
while (1) {
int signal;
if (0 != sigwait(&sigset, &signal)) {
break;
}
}
}
出现的问题是这个断言失败,也就是说sigwait失败了。后来打印出sigwait的返回值,发现sigwait的失败的原因时EINTR,也就说 sigwait被一个信号中断了,但是不知道信号来自何处。说到此处,先说明一下,sigwait这个函数很奇怪,跟一般的linux API不同。sigwait出错的时候,并不设置errno,而直接把errno错误值返回。
通过增加一个新的判断
int ret = sigwait(&sigset, &signal));
if (EINTR == ret) {
continue;
}
else if (ret) {
break;
}
毕竟sigwait作为一个阻塞操作,因为收到信号而失败,是可以接受的行为,所以要对EINTR进行特殊处理。
加上这一句后,发现原来在另外一个线程有一个非法内存错误,所以产生了一个SIGSEGV信号。到此,虽然这个问题是由于这个内存问题引起的,但是实际上从这个问题的现象上看,在多线程下使用sigwait容易引起一些问题。
1.在POSIX标准中,当进程收到信号时,如果是多线程的情况,我们是无法确定是哪一个线程处理这个信号。而sigwait是从进程中pending的信号中,取走指定的信号。这样的话,如果要确保sigwait这个线程收到该信号,那么所有线程含主线程以及这个sigwait线程则必须block住这个信号。否则如果在两次sigwait之间,收到了指定信号,该信号很有可能被任意一个线程处理掉。
2.sigwait的名字以及在man中的介绍容易引起人的误解。
1)sigwait,从名字上看只等待指定信号集。这样很容易让人感觉除指定信号外,其他信号不会促使sigwait的返回;
2)来看看man中的说明The sigwait() function suspends execution of the calling thread until the delivery of one of the signals specified in the signal set set.这里也说了,sigwait会一直suspend直到指定信号发生。另外,man中的errors说明也容易引起误解。man中只有一个错误,就是EINVAL,给人感觉sigwait不会被信号中断。
ERRORS
EINVAL set contains an invalid signal number.
(我的系统是FC12)
但是按照我一直以来的经验,基本上所有的阻塞操作都会被信号中断,除非设置了RESTART标志。所有我建议同事加了以上的代码。
后来看到man中还有这么一句,
NOTES
sigwait() is implemented using sigtimedwait(2).
于是又查看了sigtimedwait。发现sigtimedwait的手册还是比较完整的。
ERRORS
EAGAIN No signal in set was delivered within the timeout period specified to sigtimedwait().
EINTR The wait was interrupted by a signal handler; see signal(7). (This handler was for a signal other than one of those in set.)
EINVAL timeout was invalid.
其实这次的代码是一个开源工具的代码,它使用信号机制作为多线程的通讯工具。个人感觉这种实现并不合适。因为在它的代码中,并没有在所有的线程中屏蔽掉需要sigwait的信号,另外该工具会产生多个线程,每个线程需要sigwait的信号是不同的。按照上面的代码,实际上它只是通过sigwait等到相应的信号来唤醒该线程,那么还不如使用pthread_cond_wait来代替sigwait呢。
发表评论
-
探索 Pexpect,第 2 部分:Pexpect 的实例分析
2013-08-19 11:08 1670原文: http://www.ibm.com/develope ... -
Sudo提权出现:xx用户不在 sudoers 文件中
2013-08-03 20:22 872Sudo提权出现:xx用户不在 sudoers 文件中 症状 ... -
atoi源码
2013-05-14 19:32 1223原文: http://blog.csdn.net/eroswa ... -
为重负网络优化 Nginx 和 Node.js
2013-05-13 01:12 952原文:http://linux.cn/forum.php?mo ... -
《APUE》:线程和fork(父子进程锁)
2013-04-29 21:07 1108《Unix环境高级编程》这本书附带了许多短小精美的小程序,我在 ... -
ubuntu eclipse 问题
2013-04-05 03:30 741Eclipse 3.6 在 Ubuntu 10.04 下会出现 ... -
linux多线程之pthread_cancel结束线程(防止死锁)
2013-03-28 18:28 1185linux多线程之pthread_cancel结束线程 摘要: ... -
c++ 多线程编程的时候遇到了一个编译问
2013-03-27 15:22 789今天在进行多线程编程的时候遇到了一个编译问题:error: a ... -
socket参数详解:KeepAlive
2013-03-19 13:24 1088TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会 ... -
ehcache分布式例子
2013-03-19 11:52 606配置文件: recluster_ehcache_0.xml ... -
Voldemort — 分布式 key-value 存储系统
2013-03-19 00:40 948Voldemort — 分布式 key-value 存储系统 ... -
java 慎用 new Random()
2013-03-11 18:14 860package tt; import java.util.* ... -
crontab中运行python程序出错,提示ImportError: No module named解决全过程
2013-03-11 16:18 1179原文地址:http://blog.csdn.net/langl ... -
Linux crontab
2013-03-08 18:27 1016crontab是Linux下最常用的计划任务服务。本文跟大家分 ... -
tinyxml 实例
2013-02-28 15:00 603tinyxml 实例 例子见附件 -
C++ 中char*,const char*,string 轉換
2013-02-26 11:34 10471. string转const char* string ... -
WARNING: source src1: skipped 14 document(s) with zero/NULL ids
2012-12-18 21:17 1902select 中缺少主键id -
libmysqlclient.so.15 is needed by .....
2012-12-18 16:22 1122libmysqlclient.so.15 is needed ... -
Redis 内存
2012-12-12 16:28 843NoSQLFan 关注NoSQL相关的新闻与技术 ... -
apache.commons工具
2012-12-03 10:22 1001本文主要介绍自己在开发过程中总结的一些Java工具类,主要包括 ...
相关推荐
Linux多线程环境中的信号处理不同于进程的信号处理。一方面线程间信号处理函数的共享性使得信号处理更为复杂,另一方面普通异步信号又可转换为同步方式来简化处理。 本文首先介绍信号处理在进程中和线程间的...
卡塔托尼 如此简单的容器初始化实际上很容易让人脑筋急... 理想情况下,我们只是为其他项目编写一个使用signalfd(2)的补丁程序,而不是创建一个新项目,但是花了一些时间查看tini和dumb-init我们认为此类补丁程序将更
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
c语言期末大作业 C语言期末大作业之图书信息管理系统实现_基于Dev-C++实现
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
爬虫selenium最新版本缺少的,快速拿去使用。
1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看懂代码,并且热爱钻研,自行调试。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
基于matlab实现的K均值聚类的图像分割,灰度图像分割案例,真彩图像分割案例.rar
基于RFID固定资产管理系统设计与实现毕业论文(28页).docx
瓦尔特弗兰德张力计WF-TC系列说明书
数据来源:中国人口与就业统计NJ-2023版
数据来源:中国电力统计NJ-2021版
数据来源:中国人口与就业统计NJ-2023版
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
数据来源:中国电力统计NJ-2021版
数据来源:中国电力统计NJ-2021版
TCN-02N-KT32S系列 普通开关型 使用说明书