gsoap多线程问题(客户端/服务器)

时间:2018-08-24 09:29:15

标签: multithreading server client gsoap

我有两个应用程序,它们相互之间可以与 SOAP 请求进行通信。两个接口都使用通过 gsoap 实现的相同接口定义。 服务器端使用 mod_gsoap for Apache运行。客户端是定制C ++ 程序。 在客户端运行一个线程,在Apache运行几个线程,它可以正常工作。当我在客户端中启动多个线程时,会收到类似高负载的错误消息:

Error -1 fault in message exchange[no subcode] - "End of file or no input: message transfer interrupted" " or "SOAP 1.1 fault SOAP-ENV:Client[no subcode] - "Operation not permitted

如果报告了错误,则至少有两个请求同时失败,因此看起来像是竞争条件。 每个客户端线程都会创建自己的代理实例。由于我使用 is-Soap 标志(-i)对其进行了编译,因此每个线程也应以这种方式拥有自己的soap结构实例。

我在这里有点茫然。我已经用wireshark检查了发生了什么。在正常情况下,客户端与服务器之间存在网络握手,请求已发布,并且Apache发送回HTTP OK。然后,客户端启动断开连接,握手-完成。 在断线的情况下,我看到从客户端到服务器的物理上新的连接-由客户端上的新端口标识-尚未通过握手建立。第一个动作是发送 FIN ACK ,服务器发送HTTP OK,导致客户端发送 RST (重置)

1 个答案:

答案 0 :(得分:0)

经过更多检查后,发现同一肥皂结构确实被多个线程使用。因此,所描述的症状是不同线程共享一个肥皂结构。

错误在于使用soap结构为对象创建线程:

vector<shared_ptr<Sender>> senders;
// create sender objects and fill senders

 for (auto s : senders) {
      auto thread_s=make_shared<thread>([&]{tl->run();});
      threads.push_back(thread_s);                                     
 }

在lambda表达式中使用引用会导致所有线程最终引用同一对象。