【问题标题】:How to handle multiple connection objects in C++如何在 C++ 中处理多个连接对象
【发布时间】:2020-07-18 05:03:15
【问题描述】:

我正在尝试实现客户端/服务器连接,其中服务器接受来自客户端的多个连接。现在服务器正在接受来自客户端的多个连接,但我必须同时进行多个连接并且必须保持已建立的连接处于等待状态。

我实现的方式如下:

std::async ([=] { serverConnect(102, "127.0.0.1"); } );
std::async ([=] { serverConnect(102, "127.0.0.1"); } );
int serverConnect(int tcpPort, const string& hostname) {
    con = Connection_create();
    Connection_connect(con, hostname.c_str(), tcpPort);
    return con;
}

以上几行同时创建了两个客户端连接,并返回连接对象,如上图。

现在我必须使连接处于等待状态才能进行进一步的操作。

我尝试过如下操作,但这不适用于下一个连接

int serverConnect(int tcpPort, const string& hostname) {
    con = Connection_create();
    Connection_connect(con, hostname.c_str(), tcpPort);
    while(con) {
    cout << "In waiting State" << endl;
}
}

上面的问题是它只对一个连接有效,并且不会执行下一个线程,尽管 while 循环在服务器断开之前不会失败。

我必须建立两个连接,建立后必须保持两个连接处于等待状态。

帮帮我,如何实现?

【问题讨论】:

  • 等待状态是什么意思?您没有对 while 循环中的连接做任何事情。异步 I/O 不应该是无限循环,它的重点是在等待某事的同时做其他事情。虽然在这种情况下,我不确定您要等待什么?
  • 我想我的问题的要点是,如果它根本不涉及 con,你想用 while 循环来完成什么?那和只是返回有什么区别?
  • 忘掉那个while循环吧。我要做的是我必须维护连接线程对象。当 async 被调用时,它会创建一个线程并建立连接,并且将同时创建下一个线程。一旦我建立了所有连接,现在我必须管理所有线程。明确两个线程在那里,我必须对第一个线程做一些事情。如何实现?
  • 好的。所以在每个线程中,你都在建立一个连接,然后等待所有其他线程完成建立连接,这样你就可以继续了吗?我说对了吗?
  • 是的,你是对的。每个线程都建立连接,建立后我必须使所有线程处于空闲状态而不是被销毁。

标签: c++ multithreading network-programming client-server


【解决方案1】:

为每个线程创建一个 std::promise。在每个 promise 上调用 get_future() 以获取关联的 std::future 对象。将这些期货存储在所有线程都可以访问的全局向量中,比如 asyncfutures。然后在每个线程中,在创建连接后为该线程调用 std::promise 上的 set_value,而不是 while 循环,执行以下操作:

for (auto fut : asyncfutures) {
    fut.wait();
}

然后继续线程活动。

wait() 函数的作用是等待其他线程根据其承诺调用 set_value。一旦等待所有其他线程调用 set_value(在它们建立连接之后发生)完成,然后 for 循环结束,所有线程一起继续使用该连接。

如果您希望所有线程不仅彼此等待,而且还等待主线程中的某个事件,您可以在 async_futures 中添加另一个未来,并在事件到达时调用 promise 对象上的 set_value。

在这个阶段没有线程返回,所以连接对象没有被破坏。

注意 std::promise 是一个模板。您可以在 cppreference.com 上查找有关承诺和期货的更多信息。

编辑:C++20 已将 latch 类型添加到 ISO C++ 标准库中。这允许您构造一个闩锁,其计数器初始化为即将运行的线程数,并在线程到达同步点时让每个线程在其上调用arrive_and_wait。这将阻塞线程,直到其他线程也到达同步点。

截至 2020 年 4 月 23 日,对 C++20 的支持在编译器中普遍缺乏或零散,但应该会在未来一两年内赶上。

【讨论】:

    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2011-10-02
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多