如何在C

时间:2017-12-03 05:30:01

标签: c multithreading pthreads

我期待获得100,000个请求,其中至少100个将是并发的。每次我收到请求时,我都会创建一个新线程,并在使用pthread_exit()完成后将其销毁。使用pthread_detach我获得了99%的成功率。还有比这更好的方法吗?

pthread_t hilo;
// infinite loop
while ((client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len))) {
    struct ClientSocket socks;
    // some code...
    pthread_create(&hilo, NULL, func, &socks);
    pthread_detach(hilo);
    printf("\nSocket is listening for the next request...\n");
}

我听说pthread_join是一种更好的方式来利用资源而不会达到线程限制,但我这样做的方式并不是并发的。

pthread_t hilo;    
// infinite loop
while ((client_sock = accept(server_sock, (struct sockaddr *) &client_sockaddr, &len))) {
    struct ClientSocket socks;
    // some code...
    pthread_create(&hilo, NULL, func, &socks);
    pthread_join(hilo, NULL); // it stops the main thread
    printf("\nSocket is listening for the next request...\n");
}

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:2)

  

每次收到请求时,我都会创建一个新线程,并在完成后将其销毁

不要:它是一件聪明的事情,因为线程创建是一个重量级的操作。

  

我听说pthread_join是一种更好的方式来利用资源而不会达到线程限制,但我这样做的方式并不是并发的。

正确。每当您看到有人pthread_create紧跟pthread_join后,您就会知道他们不知道自己在做什么。只需直接调用func即可获得完全相同的结果(更有效率)。

  

任何想法都将不胜感激!

您需要一个生产者 - 消费者队列。侦听线程将accept连接并将它们排入队列((大小有限的)线程池中的其他线程。其他线程将使一项工作出列,并对该项目执行func。然后返回下一个项目,依此类推。

这是example生产者/消费者实施。但你可以通过“生产者消费者队列”搜索找到许多其他人。