如何在 C++ 中处理多个连接对象
How to handle multiple connection objects in C++
我正在尝试实施 client/server 连接,其中服务器接受来自客户端的多个连接。现在服务器正在接受来自客户端的多个连接,但我必须同时进行多个连接,并且必须保持已建立的连接处于等待状态。
我实现的方式如下:
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;
}
以上行同时创建了两个客户端连接和 returns 连接对象,如上所示。
现在我必须让连接处于等待状态才能进行进一步的操作。
我试过像下面那样做,但这对下一个连接不起作用
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 循环在服务器断开连接之前不会失败。
我必须建立两个连接,并且在建立后必须将两个连接保持在等待状态。
帮帮我,如何实现?
为每个线程创建一个 std::promise。对每个承诺调用 get_future() 以获取关联的 std::future 对象。将这些 futures 存储在所有线程都可以访问的全局向量中,比如 asyncfutures。然后在每个线程中,在创建连接后在该线程的 std::promise 上调用 set_value,而不是 while 循环,执行:
for (auto fut : asyncfutures) {
fut.wait();
}
然后继续线程活动。
wait() 函数的作用是等待另一个线程根据其承诺调用 set_value。一旦等待所有其他线程调用 set_value(在它们建立连接后发生)完成,则 for 循环结束,所有线程一起继续使用连接。
如果您希望所有线程不仅相互等待,而且还等待主线程中的某个事件,您可以将另一个未来添加到 async_futures 并在 promise 对象上调用 set_value一旦达到事件。
在这个阶段没有线程returns,所以连接对象没有被销毁。
请注意,std::promise 是一个模板。您可以在 cppreference.com 上查找更多关于 promises 和 futures 的信息。
编辑:C++20 已将 latch
类型添加到 ISO C++ 标准库中。这允许您构造一个闩锁,其计数器初始化为大约 运行 的线程数,并让每个线程在线程到达同步点时对其调用 arrive_and_wait
。这将阻塞线程,直到其他线程也到达同步点。
截至 2020 年 4 月 23 日,编译器对 C++20 的支持普遍缺乏或零散,但应该会在未来一两年内赶上。
我正在尝试实施 client/server 连接,其中服务器接受来自客户端的多个连接。现在服务器正在接受来自客户端的多个连接,但我必须同时进行多个连接,并且必须保持已建立的连接处于等待状态。
我实现的方式如下:
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;
}
以上行同时创建了两个客户端连接和 returns 连接对象,如上所示。
现在我必须让连接处于等待状态才能进行进一步的操作。
我试过像下面那样做,但这对下一个连接不起作用
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 循环在服务器断开连接之前不会失败。
我必须建立两个连接,并且在建立后必须将两个连接保持在等待状态。
帮帮我,如何实现?
为每个线程创建一个 std::promise。对每个承诺调用 get_future() 以获取关联的 std::future 对象。将这些 futures 存储在所有线程都可以访问的全局向量中,比如 asyncfutures。然后在每个线程中,在创建连接后在该线程的 std::promise 上调用 set_value,而不是 while 循环,执行:
for (auto fut : asyncfutures) {
fut.wait();
}
然后继续线程活动。
wait() 函数的作用是等待另一个线程根据其承诺调用 set_value。一旦等待所有其他线程调用 set_value(在它们建立连接后发生)完成,则 for 循环结束,所有线程一起继续使用连接。
如果您希望所有线程不仅相互等待,而且还等待主线程中的某个事件,您可以将另一个未来添加到 async_futures 并在 promise 对象上调用 set_value一旦达到事件。
在这个阶段没有线程returns,所以连接对象没有被销毁。
请注意,std::promise 是一个模板。您可以在 cppreference.com 上查找更多关于 promises 和 futures 的信息。
编辑:C++20 已将 latch
类型添加到 ISO C++ 标准库中。这允许您构造一个闩锁,其计数器初始化为大约 运行 的线程数,并让每个线程在线程到达同步点时对其调用 arrive_and_wait
。这将阻塞线程,直到其他线程也到达同步点。
截至 2020 年 4 月 23 日,编译器对 C++20 的支持普遍缺乏或零散,但应该会在未来一两年内赶上。