从文本文件中读取字符串并同时将它们发送到服务器

时间:2017-02-04 05:02:13

标签: c multithreading pthreads

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

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线程研究了多线程,但我无法想出一些实际上似乎异步运行的东西

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函数,但我不确定在这种情况下哪种方法是正确的。

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

1 个答案:

答案 0 :(得分:2)

它并非真正并行:

pthread_create(&threads, NULL, conn, &args);
pthread_join(threads, &res);

这里创建线程来完成工作,但主线程正在等待它完成。因此,只有单个线程同时运行 - 主要或工作者。

要并行执行,有两个选项:

  1. 为文件中的每一行创建并启动线程,并将其放入列表中。最后,等待pthread_join()的所有线程。这可能适用于合理数量的输入行,因为通常有总线程/进程限制。
  2. 创建一个线程池和工作项队列。队列将遵循常见的生产者 - 消费者模式,其中主线程是生产者,线程池线程是消费者。当消费者线程被添加到队列中并进行处理时,消费者线程将选择该工作项。
  3. 第二种方法要好得多,它限制了最大线程数,它还可以使底层资源可重用(套接字连接)。

    Java对此有很好的抽象,请参阅ExecutorService

    对于C你可能没有太多的选择,要么你自己可以实现它。这并不是那么困难 - 一个互斥锁保护队列结构和条件,宣告项目的可用性(如果你想限制生产者,可能是另一个)。或者您可以查看可能提供线程池,队列和类似内容的Thread Building BlocksACE