• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

如何在C中同时处理100,000个请求

c/c++ 来源:Hafiz Temuri 4次浏览

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

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"); 
} 

任何想法,将不胜感激!


===========解决方案如下:

每次我得到的请求,我创建一个新的线程,并摧毁它,一旦它完成

别:它一个聪明的做法,因为线程的创建是一个重量较轻的操作。

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

正确。无论何时你看到有人在做pthread_create之后立即跟着pthread_join,你都可以知道他们不知道他们在做什么。只需简单地直接拨打func即可实现完全相同的结果(效率更高)。

任何想法,将不胜感激!

您需要一个生产者 – 消费者队列。监听线程将accept连接并将它们排入一个(大小受限)线程池中的其他线程。其他线程将出列一项工作,并对该项目执行func。然后回到下一个项目,等等。

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)