gpt4 book ai didi

c - pthread_create 和套接字描述符未同步

转载 作者:行者123 更新时间:2023-11-30 14:24:15 25 4
gpt4 key购买 nike

 main() {
unsigned int newfd;
...
.....
while (1) {
printf("Waiting for connection\n");
addrlen = sizeof (clientaddr);
if ((newfd = accept(listener, (struct sockaddr *) &clientaddr, &addrlen)) < 0) {
perror("Server-accept() error lol!");
break;
}
printf("New connection from %s on socket %u\n", inet_ntoa(clientaddr.sin_addr), newfd);
pthread_create(&threads[i++], NULL, (void*)fileTransfer_Worker, &newfd);
sleep(1);
}

}

void* fileTransfer_Worker(void *desc) {
unsigned int sock = *(unsigned int *) desc;
printf("Waiting for data in sock %d %u\n", sock, pthread_self());
}

输出

Waiting for connection
New connection from 192.168.4.57 on socket 4
Waiting for connection
New connection from 192.168.4.57 on socket 5
Waiting for connection
Waiting for data in sock 4 3076578160
Waiting for data in sock 5 3068189552
New connection from 192.168.4.57 on socket 6
Waiting for connection
Waiting for data in sock 6 3059800944
New connection from 192.168.4.57 on socket 7
Waiting for connection
New connection from 192.168.4.57 on socket 8
Waiting for connection
New connection from 192.168.4.57 on socket 9
Waiting for connection
Waiting for data in sock 8 3051412336
New connection from 192.168.4.57 on socket 10
Waiting for data in sock 9 3034635120
Waiting for data in sock 10 3043023728
Waiting for connection
New connection from 192.168.4.57 on socket 11
Waiting for connection
New connection from 192.168.4.57 on socket 12
Waiting for connection
New connection from 192.168.4.57 on socket 13
Waiting for connection
Waiting for data in sock 13 3001080688
Waiting for data in sock 13 3026246512
Waiting for data in sock 13 3017857904
Waiting for data in sock 13 3009469296

如果您查看输出,您会发现 sock 13 显示了 4 次,这实际上应该针对套接字 7、11、12 和 13。

每次当我同时调用更多客户端连接时,行为都会发生变化。

如果我在 pthread_create() 之后添加 sleep(1) 那么我就能看到预期的行为。 pthread_create 之后的 sleep 是必须的吗?或者如何在不使用 sleep 的情况下解决这个问题?

帮我解决这个问题。提前致谢

最佳答案

pthread_create(&threads[i++], NULL, (void*)fileTransfer_Worker, &newfd);
^^^^^^

问题在于您将局部变量的地址传递给pthread_create。当线程开始使用它时,main 可能已经更改了它。因此,如果调用 pthread_create 时描述符为 10,则当线程实际开始使用 main 时,已经有机会更改它。

您至少有 2 个选项可以解决此问题:

  • 为每个线程传递一个单独的对象(可能是您 malloc 的对象)
  • 将整数填充到参数中,就像它是 void * 一样,然后在线程函数中强制转换回 int

虽然第二个选项被广泛使用,但它也是不可移植的。

关于c - pthread_create 和套接字描述符未同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12034103/

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