帮助客户解决他们遇到的问题。我更像是一个系统管理员/DBA 人,所以我正在努力帮助他们。他们说这是内核/环境中的错误,在我坚持认为它在他们的代码中或寻求操作系统的供应商支持之前,我试图证明或反驳这一点。
发生在 Red Hat 和 Oracle Enterprise Linux 5.7(和 5.8)上,应用程序是用 C++ 编写的
他们遇到的问题是主线程启动了一个单独的线程来执行可能长时间运行的 TCP connect() [客户端连接到服务器]。如果“长时间运行”方面花费的时间太长,他们会取消线程并启动另一个线程。
这样做是因为我们不知道服务器程序的状态:
- 服务器程序启动并运行 --> 立即接受连接
- 服务器程序未运行,机器和网络正常 --> 连接立即失败,出现错误“连接被拒绝”
- 机器或网络崩溃或关闭 --> 连接需要很长时间才能失败,并出现错误“没有到主机的路由”
问题是取消已锁定互斥锁的线程(设置清除处理程序以解锁互斥锁)有时不会解锁互斥锁。
这使得主线程挂起试图锁定互斥锁。
详细环境信息:
- glibc-2.5-65
- glibc-2.5-65
- libcap-1.10-26
- 内核调试-2.6.18-274.el5
- glibc-headers-2.5-65
- glibc-common-2.5-65
- libcap-1.10-26
- 内核-doc-2.6.18-274.el5
- 内核-2.6.18-274.el5
- kernel-headers-2.6.18-274.el5
- glibc-devel-2.5-65
代码是用:c++ -g3 tst2.C -lpthread -o tst2 构建的
非常感谢任何建议和指导