首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从文本文件中读取字符串并并发发送到服务器

从文本文件中读取字符串并并发发送到服务器
EN

Stack Overflow用户
提问于 2017-02-04 05:02:13
回答 1查看 62关注 0票数 0

我有一个关于并发网络编程的理论问题。我正在尝试创建一个客户端的网络工具,我需要它执行得非常快。该程序将从文本文件中读取IP地址列表,并在其上运行一些功能。例如,这一职能:

代码语言:javascript
复制
void conn(char *host, const char *port, char *test_string)
{
    struct addrinfo *res;  
    struct addrinfo hints;      
    memset(&hints, 0, sizeof(hints));   
    hints.ai_family = PF_UNSPEC;    
    hints.ai_socktype = SOCK_STREAM;    
    getaddrinfo(host, port, &hints, &res);
    int s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
    if (s == -1) error("failed to open socket");
    int c = connect(s, res->ai_addr, res->ai_addrlen);
    // send string from file
    // recv message
    freeaddrinfo(res);          
}

我希望同时向服务器发送请求,以获得更好的性能,但我不知道该如何做到这一点。我已经做过关于posix线程多线程的研究,但是我想不出一些实际似乎异步运行的东西。

代码语言:javascript
复制
while (fgets(buf, sizeof(buf), stringlist)) {
    if ((c = strchr(buf, '\n')) != NULL) 
        *c = '\0';
        strncpy(args.test, buf, 20);
        pthread_create(&threads, NULL, conn, &args);
        pthread_join(threads, &res);
    }
} 

我意识到这肯定不会以任何方式提高性能,我已经做了进一步的研究,但我开始感到迷茫。我知道使用fcntl来实现套接字的非阻塞和异步,以及i/o复用的select函数,但我不确定在这种情况下哪种方法是正确的。

简单地说,我的问题是:从文本文件中读取字符串并向服务器发送包含字符串的并发请求的好方法是什么。多线程是否适合这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 05:21:42

它实际上并不是并行运行的:

代码语言:javascript
复制
pthread_create(&threads, NULL, conn, &args);
pthread_join(threads, &res);

在这里,创建线程是为了完成工作,但是主线程正在等待它完成。因此,只有一个线程同时运行--要么是主线程,要么是工作线程。

要并行执行,有两种选择:

  1. 为文件中的每一行创建并启动线程,并将其放入列表中。最后,等待使用pthread_join()的所有线程。这可能适用于合理数量的输入行,因为总线程/进程通常是有限制的。
  2. 创建线程池和工作项队列。队列将遵循常见的生产者-使用者模式,其中主线程是生产者,线程池线程是使用者。使用者线程将在将工作项添加到队列中并对其进行处理时选择它。

第二种方法要好得多,它限制了线程的最大数量,还可以使底层资源可重用(套接字连接)。

Java对此有相当好的抽象,参见ExecutorService

对于C,您可能没有太多的选项,要么您可以自己实现它。这并不难--一个互斥保护队列结构和条件,宣布项目的可用性(如果你也想限制生产者的话,也可能是另一个)。或者您可以查看线程构建块王牌,它们可能提供线程池、队列等等。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42036671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档