boost beast同步应用程序-是否需要显式并发处理



考虑一下官方的boost beast websocket服务器同步示例

具体来说,这部分:

for(;;)
{
// This buffer will hold the incoming message
beast::flat_buffer buffer;
// Read a message
ws.read(buffer);
// Echo the message back
ws.text(ws.got_text());
ws.write(buffer.data());
}

为了简化场景,我们假设它只进行写入,并且每次写入的数据都不同。

for(;;)
{
// assume some data has been prepared elsewhere, in str
mywrite(str);
}
...
void mywrite(char* str)
{
net::const_buffer b(str, strlen(str));
ws.write(b);
}

这应该没问题,因为对mywrite的所有调用都是按顺序进行的。

如果我们有多个线程和同一个for循环怎么办?即,如果我们同时调用mywrite和扩展到ws.write,该怎么办?需要strand还是mutex之类的东西

换句话说,当从多个线程调用ws.write时,我们是否需要显式处理并发

我还没有理解他们提到的文档:

Thread Safety
Distinctobjects:Safe.
Sharedobjects:Unsafe. The application must also ensure that all asynchronous operations are performed within the same implicit or explicit strand.

然后

Alternatively, for a single-threaded or synchronous application you may write:
websocket::stream<tcp_stream> ws(ioc);

这似乎意味着ws对象不是线程安全的,但对于同步应用程序的特定情况,没有构建显式链,这意味着它可以吗?

我无法通过阅读示例或websocket实现来解决这个问题。我以前从未使用过asio

我试着如下测试,它在我的笔记本电脑上似乎没有失败,但我不能保证这对其他情况有效。我也不确定这对我所描述的案例是否有效。

auto lt = [&](unsigned long long i)
{
char s[1000] = {0};
for(;;++i)
{
sprintf(s, "Hello from thread:%llu", i);
mywrite(s,30);
}
};
std::thread(lt, 10000000u).detach();
std::thread(lt, 20000000u).detach();
std::thread(lt, 30000000u).detach();
// ws client init, as the official example
for (int i = 0; i < 100; ++i)
{
beast::flat_buffer buffer;
// Read a message into our buffer
ws.read(buffer);

// The make_printable() function helps print a ConstBufferSequence
std::cout << beast::make_printable(buffer.data()) << std::endl;
}

是的,您需要同步,因为您从多个线程访问对象。

你引用的文件非常清楚:

共享对象:不安全〔…〕

关于你困惑的理由:

这似乎意味着ws对象不是线程安全的,但对于同步应用程序的特定情况,没有构建显式链,这意味着它可以吗?

这是可以的,因为它是单线程的,而不是同步的。事实上,即使是单线程,您仍然需要一个串来防止重叠的异步写入操作。这就是第二部分所暗示的:

[…]应用程序还必须确保所有异步操作都在同一隐式或显式链中执行。

现在,可能为您解决难题的缺失部分是该示例具有隐式逻辑链(非重叠异步操作的顺序链(。另请参阅为什么在使用boost::asio时,我需要每个连接一条绞线?

相关内容

  • 没有找到相关文章

最新更新