[英]How to execute a function asynchronously in c++?
我現在正在為一個c ++隊列管理程序工作。 我添加了偽代碼和序列圖。 SomeClass :: Handler提供了許多數據數據。 因此,我必須將所有數據保存到隊列中。 並且工作人員必須操縱數據以將其轉換為Command實例。 所以我想做一個線程來從數據生成命令。 但是我想將輔助線程的數量限制為一個,以便命令生成進程的數量始終為一個。 生成命令后,我想將此命令返回給SomeClass。
我完全困惑如何實現此設計。 任何幫助將不勝感激。
編輯以獲得更多規范。
`
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 !?
在線程之間傳遞數據的最干凈,最安全的方法是使用Future和Promise 。 cppreference上的std::future
頁面是一個不錯的起點。
//如果沒有工人,我想開始新的工人
在開始計算之前,我將創建一個包含單個活動工作程序的線程池,這樣您就不必檢查工作程序是否可用。 如果您不能執行此操作,則表明是否已創建工作程序的std::atomic
標志就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.