C++ 庫 - <syncstream>



C++20 中的<syncstream> 標頭檔案提供了一種方便的方式來以執行緒安全的方式管理輸出流。隨著現代應用程式中多執行緒的興起,確保來自不同執行緒的輸出不會相互干擾變得越來越重要。傳統的輸出流(如 std::cout)不是執行緒安全的,當多個執行緒同時嘗試寫入同一個流時,會導致資料競爭和不可預測的輸出。

<syncstream> 標頭檔案透過引入 std::syncbuf 類來解決此問題,該類允許建立同步輸出流。這些流確保輸出操作是原子的,這意味著當一個執行緒正在寫入同步流時,其他執行緒會被阻塞,直到操作完成。

包含 <syncstream> 標頭檔案

要在你的 C++ 程式中包含 <syncstream> 標頭檔案,可以使用以下語法。

#include <syncstream>

<span> 標頭檔案的函式

以下是 <span> 標頭檔案中所有函式的列表。

序號 函式及描述
1 operator=

它賦值一個 basic_syncbuf 物件。

2 swap

它交換兩個 basic_syncbuf 物件。

3 emit

它以原子方式將整個內部緩衝區傳輸到包裝的 streambuf。

4 get_wrapped

它檢索包裝的 streambuf 指標。

5 get_allocator

它檢索此 basic_syncbuf 使用的分配器。

6 set_emit_on_sync

它更改當前的 emit-on-sync 策略。

7 sync

它根據當前的 emit-on-sync 策略發出或記錄掛起的重新整理。

8 rdbuf

它獲取指向底層 basic_syncbuf 的指標。

一起重新整理多個輸出

在以下示例中,我們將把多個輸出訊息組合成單個重新整理。

#include <iostream>
#include <syncstream>
int main() {
   std::osyncstream a(std::cout);
   a << "Hi, " <<
      "Hello, " <<
      "Welcome" << std::endl;
   return 0;
}

輸出

以下是上述程式碼的輸出 -

Hi, Hello, Welcome

手動控制重新整理

考慮以下示例,我們將使用 flush() 函式手動重新整理輸出。

#include <iostream>
#include <syncstream>
#include <chrono>
#include <thread>
int main() {
   std::osyncstream a(std::cout);
   a << "Welcome.";
   a.flush();
   std::this_thread::sleep_for(std::chrono::seconds(3));
   a << "Visit Again!" << std::endl;
   return 0;
}

輸出

以上程式碼的輸出如下 -

Welcome.Visit Again!
廣告