C++。 Ubuntu 服务器 14.04。 g++ 4.9
我读了很多相关信息,但是......我的问题是另一个标准问题。所以....关于我的应用程序架构的几句话
具有一些管理功能的主流程
30 个子线程通过套接字连接执行一些工作
我首先为 Windows 编写了应用程序。并且在windows下效果很好。但我需要在linux上重写它。一切都很好,我重写了它,但是......它崩溃了。当我调试它时,我发现了一个我不明白的问题,并且在互联网上没有答案 - 所以当我放置代码时,在这 30 个子线程中的每一个中
sock=socket(....); ///all is ok with this string
它返回零。在每个线程中。因此,所有这些线程都使用一个套接字,这意味着应用程序很疯狂))例如,我尝试输入这段代码
int fd=open("tmp.tmp",....); ///I forget what flag is there
它也返回零。然后我尝试在主进程中执行相同的操作 - 它返回正常整数,例如 15,16 等。
然后我尝试做类似的事情
while (sock<=0)
{
sock=socket(...);
usleep(91000);
if (sock<=0)
{
try{
close(sock);
}
catch (...)
{
//blablabla
}
}
}
并且......它有时会给我整数 - 但它每 2-3 分钟发生一次。所以极其罕见。这意味着这是一些系统问题。系统不想给我打开套接字的真实文件描述符......我还使用互斥体来避免多个线程同时创建套接字。
我知道Linux中的线程使用相同的文件描述符表。但为什么它在所有情况下都返回零呢?为什么它在主进程中不返回零?又该如何解决呢?(
谢谢......
更新!这是一个与我使用相同的示例代码
#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
等等
非常感谢大家,抱歉。我的算法出了问题。它在循环中多次关闭和打开套接字。非常感谢大家。
我是一名优秀的程序员,十分优秀!