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

标签 c++ linux multithreading sockets

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

等等

最佳答案

非常感谢大家,抱歉。我的算法出了问题。它在循环中多次关闭和打开套接字。 非常感谢大家。

关于c++ - 线程零文件描述符中的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41441194/

相关文章:

c++ - 'char (&) [13]' 是什么意思?

linux - OpenVPN 多个 IP 地址

linux - 如何每天轮换日志,仅使用当天的数据?

multithreading - 多线程会加快代码从磁盘读取到内存的速度吗?

c++ - 临时右值引用对象的生命周期

c++ - 建立许多哈希表

c++ - 警告 : 'void checkGlError(const char*)' used but never defined

linux - 如何知道 Linux 中特定引脚的中断/GPIO 编号

multithreading - 内存屏障/栅栏如何抑制 CPU 执行的指令重新排序?

java - 使用线程池添加到列表中