如何在創建新線程的同時停止運行線程並恢復同一個線程? (how to stop running thread and resume the same thread beside create new thread?)


問題描述

如何在創建新線程的同時停止運行線程並恢復同一個線程? (how to stop running thread and resume the same thread beside create new thread?)

我使用 concurrent_queue.h 來讓隊列接收來自不同線程的元素 ‑

每次某個線程將元素添加到並發隊列時,我都會調用一些方法來創建新線程以從隊列中獲取元素並處理它(調用一些對這個項目做某事的方法)

concurrency::concurrent_queue<Item> _queue;


void handleItem(Item item)
{
    // do something with item  
}

// method that call every time add something to the queue ‑ can be 
// situation that the queue contain more then one item 
void handleQueueItem()
{
    Item item;
    while (_queue.try_pop(item))
    {
        std::thread t1(&handleItem, item);      

        t1.join();      // wait till finish before handle next item.        
    }
}

我想以其他方式創建線程 t1,這樣我每次隊列中有東西時都不需要創建新線程

我不知道該怎麼做。


參考解法

方法 1:

Instead of spinning up a thread in handleQueueItem, you can make handleQueueItem run in its own thread and it will run continuously. That would look like

void handleItem(Item item)
{
    // do something with item  
}

void handleQueueItem()
{
    Item item;
    while (_queue.try_pop(item))
    {  
        handleItem(item)
    }
}

std::thread runner([](){ handleQueueItem(); });

You can even add a flag to the loop so you can stop the thread by adding a std::atomic<bool> variable and checking it in the loop like

std::atomic<bool> run = true;
void handleQueueItem()
{
    Item item;
    while (run && _queue.try_pop(item))
    {  
        handleItem(item)
    }
}

std::thread runner([](){ handleQueueItem(); });

// later on
run = false;
runner.join();

And then all you need to do is run = false; to have the loop stop.

(by YanshofNathanOliver)

參考文件

  1. how to stop running thread and resume the same thread beside create new thread? (CC BY‑SA 2.5/3.0/4.0)

#air






相關問題

如何在 Adobe Air 的 LIKE 運算符模式中使用命名參數 (How to use named parameters inside LIKE operator pattern in Adobe Air)

Android 和 Flash Professional CS 5 Adobe Air Audio:流錯誤 (Android & Flash Professional CS 5 Adobe Air Audio: Stream Error)

可以從 web 視圖中的鏈接觸發我的 Air 應用程序中的操作嗎? (It's possible to trigger an action in my Air app, from a link in a webview?)

動作腳本、NativeProcess、resolvePath 和 swf 不起作用 (Action script, NativeProcess , resolvePath and swf does not work)

如何在創建新線程的同時停止運行線程並恢復同一個線程? (how to stop running thread and resume the same thread beside create new thread?)

我怎樣才能很好地在視圖堆棧之間製作動畫 (How can I nicely animate between viewstacks)

Adobe AIR 從 Flash 是一場大災難? (Adobe AIR from Flash a big disaster?)

“Adobe Flex”和使用 fl.controls 和 fl.events 庫的 AS3 應用程序有什麼區別? (what is the difference between "Adobe Flex" and an AS3 app using fl.controls and fl.events libraries?)

表面上的 Playbook AIR SDK 圖像 (Playbook AIR SDK images on surface)

Adobe AIR 應用程序音頻 (Adobe AIR application audio)

需要在 AIR 上設置 cookie 標頭,使用 SWFLoader 檢索遠程 Flex .swf 文件 (Need to set cookie header on AIR use of SWFLoader to retrieve remote Flex .swf file)

AIR 應用程序的 ActionScript 項目? (ActionScript Project to AIR Application?)







留言討論