我有一个关于并发网络编程的理论问题。我正在尝试创建一个客户端的网络工具,我需要它执行得非常快。该程序将从文本文件中读取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函数,但我不确定在这种情况下哪种方法是正确的。
简单地说,我的问题是:从文本文件中读取字符串并向服务器发送包含字符串的并发请求的好方法是什么。多线程是否适合这种情况?
发布于 2017-02-04 05:21:42
它实际上并不是并行运行的:
pthread_create(&threads, NULL, conn, &args);
pthread_join(threads, &res);在这里,创建线程是为了完成工作,但是主线程正在等待它完成。因此,只有一个线程同时运行--要么是主线程,要么是工作线程。
要并行执行,有两种选择:
pthread_join()的所有线程。这可能适用于合理数量的输入行,因为总线程/进程通常是有限制的。第二种方法要好得多,它限制了线程的最大数量,还可以使底层资源可重用(套接字连接)。
Java对此有相当好的抽象,参见ExecutorService。
对于C,您可能没有太多的选项,要么您可以自己实现它。这并不难--一个互斥保护队列结构和条件,宣布项目的可用性(如果你也想限制生产者的话,也可能是另一个)。或者您可以查看线程构建块或王牌,它们可能提供线程池、队列等等。
https://stackoverflow.com/questions/42036671
复制相似问题