我期待获得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");
}
任何想法都将不胜感激!
答案 0 :(得分:2)
每次收到请求时,我都会创建一个新线程,并在完成后将其销毁
不要:它不是一件聪明的事情,因为线程创建是一个重量级的操作。
我听说pthread_join是一种更好的方式来利用资源而不会达到线程限制,但我这样做的方式并不是并发的。
正确。每当您看到有人pthread_create
紧跟pthread_join
后,您就会知道他们不知道自己在做什么。只需直接调用func
即可获得完全相同的结果(更有效率)。
任何想法都将不胜感激!
您需要一个生产者 - 消费者队列。侦听线程将accept
连接并将它们排入队列((大小有限的)线程池中的其他线程。其他线程将使一项工作出列,并对该项目执行func
。然后返回下一个项目,依此类推。
这是example生产者/消费者实施。但你可以通过“生产者消费者队列”搜索找到许多其他人。