gpt4 book ai didi

c - 使用 -lpthread 在 C 中实现多线程

转载 作者:行者123 更新时间:2023-11-30 18:35:26 26 4
gpt4 key购买 nike

因此,我设计了一个服务器来实时接受多个客户端,其中客户端将“说话”,服务器将“重复”它。客户将一直保持活跃状态​​,直到我退出为止。我尝试使用 -lpthread 实现此目的,但服务器将接受所有客户端连接,但随后忽略除第一个客户端之外收到的所有命令。这是我迄今为止尝试过的:

int main(int argc, char *argv[]) {
pthread_t client_thread;
pthread_attr_t attr;
...
while(1) { /* main accept() loop */


sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
&sin_size)) == -1) {
perror("accept");
continue;
}
printf("server: got connection from %s\n", \
inet_ntoa(their_addr.sin_addr));

pthread_attr_t attr;
pthread_attr_init(&attr);

for (int i = 0; i < MAX_CLIENTS; i++) {
pthread_create(&client_thread, &attr, decider, new_fd);
pthread_join(client_thread,NULL);
}
...

目前,我唯一可以选择的选项是多线程或线程池。谢谢。

最佳答案

您调用pthread_create,然后立即pthread_join

问题在于,pthread_join等待线程退出,从而使代码串行而不是并行。

如果您想在收到连接时动态创建一个线程,则创建一个线程。不要在循环中创建 MAX_CLIENT 线程,其中所有线程都处理相同的连接。

<小时/>

如果你想使用线程池,那么首先在“主accept()循环”之前创建所有线程,并且让它们什么都不做(一开始)。然后使用一个( protected )队列,在其中添加新连接,线程检查该队列是否有新连接,尚未处理连接的线程将拾取该连接并进行处理。

在伪代码中,类似这样:

thread_function()
{
while (true)
{
sleep_while_queue_is_empty();
get_descriptor_from_queue();

handle_connection();
}
}

关于c - 使用 -lpthread 在 C 中实现多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46755169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com