线程零文件描述符中的套接字

时间:2017-01-03 10:18:58

标签: c++ linux multithreading sockets

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

等等

1 个答案:

答案 0 :(得分:1)

非常感谢并抱歉。麻烦在我的algorythm。它在循环中关闭并多次打开插座。 非常感谢所有人。