gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:57:45 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com