C中的多线程服务器(线程丢失)

时间:2019-12-27 12:58:37

标签: c multithreading tcp server pthreads

我正在使用多线程服务器来解决此问题。服务器必须为每个连接创建一个新线程,这是代码:

int main() {
   int client, val = 1;
   struct sockaddr_in saddr;
   socklen_t slen = sizeof(struct sockaddr_in);

   s_sock = socket(F_INET, SOCK_STREAM, 0);

   memset( &saddr, 0, sizeof(struct sockaddr_in));
   saddr.sin_family = AF_INET;
   saddr.sin_port = htons(PORT);
   inet_aton(HOST, &saddr.sin_addr);
   setsockopt( s_sock, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(int) );
   bind(s_sock, (struct sockaddr*) &saddr, sizeof(saddr));

   listen(s_sock, MAX_CONN);

   while(1) {
      pthread_t thread;
      client = accept( s_sock, (struct sockaddr*) &saddr, &slen);
      printf("Accepted a client\n");
      pthread_create(&thread, NULL, server, (void*) &client);
   }
   return 0;
}

问题是,如果我同时启动多个客户端,第一个客户端丢失,最后一个成功完成。我猜是因为变量thread会在接受另一个连接时被重写而发生。 为什么会发生这种情况以及如何解决?

1 个答案:

答案 0 :(得分:1)

发生这种情况是因为client而不是thread被重写了。

   while(1) {
      pthread_t thread;
      client = accept( s_sock, (struct sockaddr*) &saddr, &slen);
      printf("Accepted a client\n");
      pthread_create(&thread, NULL, server, (void*) &client);
   }

您在这里有比赛条件。调用pthread_create之后,该线程将循环返回并更改client的值,而不会进行同步。那么,新创建的线程可以对&client做些什么?它无法跟随指针获取描述符,因为该线程将在某个不可预测的时间修改client

想象一下,如果此循环快速运行两次,而没有其他线程运行的机会。现在,您已经创建了两个线程,并将两个线程都传递给&client-这是非常相同的值。现在,您有两个线程在同一个套接字上工作,而一个套接字丢失了。

请勿将要更改其值的某些变量的地址传递给线程!