我正在帮助一个客户解决他们遇到的问题。由于我更专注于系统管理员/数据库管理方面,所以我在帮助他们时感到有些吃力。他们说这是内核/环境中的一个bug,我正试图证明或证伪这一点,然后才会坚持认为这是他们的代码问题或者寻求厂商对操作系统的支持。
在Red Hat和Oracle Enterprise Linux 5.7(和5.8)上出现了这个问题,应用程序是用C++编写的。
他们遇到的问题是主线程启动一个单独的线程来执行可能运行时间很长的TCP connect() [客户端连接到服务器]。如果'长时间运行'方面太长,他们会取消该线程并启动另一个线程。
之所以这样做是因为我们不知道服务器程序的状态:
- 服务器程序正在运行-->立即接受连接
- 服务器程序没有运行,机器和网络都OK-- >立即失败,出现错误“connection refused”
- 机器或网络崩溃或关闭-->连接需要很长时间才能失败,并出现错误“no route to host”
问题在于取消已锁定互斥量的线程(使用清理处理程序设置为解锁互斥量)有时不会解锁互斥量。
这让主线程在尝试锁定互斥量时挂起。
详细的环境信息:
- glibc-2.5-65
- glibc-2.5-65
- libcap-1.10-26
- kernel-debug-2.6.18-274.el5
- glibc-headers-2.5-65
- glibc-common-2.5-65
- libcap-1.10-26
- kernel-doc-2.6.18-274.el5
- kernel-2.6.18-274.el5
- kernel-headers-2.6.18-274.el5
- glibc-devel-2.5-65
代码是用以下方式构建的:
-g3 tst2.C -lpthread -o tst2非常感谢任何建议和指导。
connect(...)
失败并出现EBADF
错误,可以检测并进行适当处理。 - clstrfsck