考慮官方的 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, 和 tows.write怎么辦?需要astrand或 a之類的東西嗎?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;
}
uj5u.com熱心網友回復:
是的,您需要同步,因為您從多個執行緒訪問物件。
您參考的檔案對此非常清楚:
共享物件:不安全 [...]
關于您感到困惑的理由:
這似乎暗示 ws 物件不是執行緒安全的,而且對于同步應用程式的特定情況,沒有顯式構造鏈,暗示它可以嗎?
沒關系,因為它是單執行緒的,而不是因為它是同步的。事實上,即使是單執行緒,你仍然需要一個 strand 來防止重疊的異步寫操作。這就是第二部分暗示的內容:
[...] 應用程式還必須確保所有異步操作都在相同的隱式或顯式鏈中執行。
現在,可能為您解決難題的缺失部分是該示例具有隱式邏輯鏈(非重疊異步操作的順序鏈)。另請參閱為什么在使用 boost::asio 時每個連接都需要 strand?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/504226.html
上一篇:在x86上獲取發布
