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

标签 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 发生的当另一个连接被接受时,它会被重写。 为什么会发生这种情况以及如何解决?

最佳答案

发生这种情况是因为客户端被重写,而不是线程

   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 ——完全相同的值。现在,您有两个线程在同一个套接字上工作,并且丢失了一个套接字。

不要向线程传递您要更改其值的某个变量的地址!

关于c - C 中的多线程服务器(线程丢失),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501165/

相关文章:

C:无法使用外部函数链接双链表中的头和尾[解决问题]

c++ - std::mutex 的释放-获取可见性保证是否仅适用于临界区?

java - Java中TCP连接过程中检测、预防和管理错误的方法有哪些?

c# - .NET TCP 服务器删除连接

c - 参数如何有类型但没有名称?

c - 是__attribute __((nonnull))是标准C

python - 使用 Python 和 pymongo 的多线程

sockets - 套接字编程,如果我写的数据超过一个 TCP/UDP 数据包会发生什么?

c - 如何限制PWM占空比值的范围?

c++ - std::shared_ptr 的 use_count() 周围的完整内存屏障是否会使它成为可靠的计数器?