C ++。 Ubuntu服务器14.04。 g ++ 4.9
我读了很多关于这个的信息,但是...我的问题是另一个与它有关的问题。所以.... 关于我的应用程序架构的几句话
具有一些管理功能的主要流程
通过套接字连接执行某些工作的30个子线程
我首先为windows编写应用程序。在Windows中它运行良好。但是我需要在linux上重写它。一切都很好我改写了但是......它崩溃了。当我调试它时,我发现了一个我不理解的问题而且在互联网上没有答案 - 所以 在我放置代码时,在这30个子线程中的每一个
sock=socket(....); ///all is ok with this string
它返回ZERO。在每个线程中。因此所有这些线程使用一个套接字,这意味着应用程序是疯了)) 我试图举例说明这段代码
int fd=open("tmp.tmp",....); ///I forget what flag is there
它也返回ZERO。 然后我尝试在主过程中做同样的事情 - 它返回正常的整数,如15,16等等。
然后我尝试做类似
的事情while (sock<=0)
{
sock=socket(...);
usleep(91000);
if (sock<=0)
{
try{
close(sock);
}
catch (...)
{
//blablabla
}
}
}
和....它给我有时整数 - 但它在2-3分钟内发生一次。极端极少。这意味着它有些麻烦。系统不想给我打开套接字的真实文件描述符... 我也使用互斥锁来不同时由多个线程创建套接字。
我知道linux中的线程使用相同的文件描述符表。但为什么它在所有情况下都会返回ZERO?为什么它在主过程中返回零?以及如何解决它?(
...谢谢
UPDATE! 这是我使用的示例代码
#include <thread>
#include <stdio.h>
#include "unistd.h"
#include "fcntl.h"
void stthread(int n)
{
int x,tfd;
for (x=0;x<10;x++)
{
tfd=open("tmp.tmp",O_WRONLY);
printf("PROCESS %i: TFD = %i\r\n",n,tfd);
close(tfd);
sleep(3);
}
}
int main()
{
int x;
for (x=0;x<30;x++)
{
std::thread tq(stthread, x);
tq.detach();
}
sleep(100);
return 0;
}
但是这个正常。如果它像我的主代码一样工作,其结果可能就像
PROCESS 1: TFD = 0
PROCESS 2: TFD = 0
等等
答案 0 :(得分:1)
非常感谢并抱歉。麻烦在我的algorythm。它在循环中关闭并多次打开插座。 非常感谢所有人。