簡體   English   中英

如何在C ++中異步執行函數?

[英]How to execute a function asynchronously in c++?

我現在正在為一個c ++隊列管理程序工作。 我添加了偽代碼和序列圖。 SomeClass :: Handler提供了許多數據數據。 因此,我必須將所有數據保存到隊列中。 並且工作人員必須操縱數據以將其轉換為Command實例。 所以我想做一個線程來從數據生成命令。 但是我想將輔助線程的數量限制為一個,以便命令生成進程的數量始終為一個。 生成命令后,我想將此命令返回給SomeClass。

我完全困惑如何實現此設計。 任何幫助將不勝感激。

編輯以獲得更多規范。

  1. 如何限制工作線程的數量,而不是避免將數據推入隊列?
  2. 如何從woker線程返回命令實例?

`

void MyClass::notify_new_data()
{
  // if there are no worker, I want to start new worker
  // But how?
}

// I want to limit the number of worker to one.
void MyClass::worker() {
  // busy loop, so should I add sleep_for(time) at the bottom of this func?
  while(queue.empty() == false) {
    MyData data;
    {
      lock_guard<std::mutex> lock(mtx);
      data = queue.pop();
    }
    // do heavy processing with data
    auto command = do_something_in_this thread();
    // how to pass this command to SomeClass!?
  }
}

// this class is called via aother thread.
void MyClass::push_data(MyData some_data) {
  {
    lock_guard<std::mutex> lock(mtx);
    queue.push(some_data);
  }
  notify_new_data();
}

void SomeClass::Handler(Data d) {
  my_class.push(data);
}

void SomeClass::OnReceivedCommand(Command cmd) {
  // receive command
}

在此處輸入圖片說明

問題不是很清楚。 我假設:

  • 你需要一個工作線程異步執行某些操作。

  • 您需要從另一個線程檢索工作線程的計算結果。


如何限制工作線程的數量,而不是避免將數據推入隊列?

查看“線程池” 用一個從線程安全隊列中讀取的單個工作線程創建一個線程池。 這幾乎就是您的MyClass::worker()正在做的事情。

//忙循環,因此我應該在此func的底部添加sleep_for(time)嗎?

您可以使用條件變量和鎖定機制來防止繁忙的等待,也可以使用成熟的無鎖定隊列實現(例如moodycamel :: ConcurrentQueue)

//如何將此命令傳遞給SomeClass !?

在線程之間傳遞數據的最干凈,最安全的方法是使用FuturePromise cppreference上std::future頁面是一個不錯的起點。

//如果沒有工人,我想開始新的工人

在開始計算之前,我將創建一個包含單個活動工作程序的線程池,這樣您就不必檢查工作程序是否可用。 如果您不能執行此操作,則表明是否已創建工作程序的std::atomic標志就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM