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


 main() {
    unsigned int newfd;
    ...
    .....
    while (1) {        
      printf("Waiting for connectionn");
      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 %un", 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 %un", 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

如果您查看输出,您会注意到袜子 13 显示 4 次,实际上应该是插槽 7、11、12 和 13。

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

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

帮我这个。提前致谢

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

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

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

  • 为每个线程传递一个单独的对象(也许是您malloc的对象(
  • 在参数中填充整数,就好像它是一个void *,然后在线程函数中转换回int

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

最新更新