如何在創建新線程的同時停止運行線程並恢復同一個線程? (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)

#ASP.NET #asp.net-3.5 #sql-server






相關問題

System.Reflection.Assembly.LoadFile 鎖定文件 (System.Reflection.Assembly.LoadFile Locks File)

如何在沒有全局變量的情況下一直保留我的變量? (How can I keep my variable all the time without global variables?)

C# / ASP.NET - Web 應用程序鎖定 (C# / ASP.NET - Web Application locking)

關閉模態對話框窗口後 ASP.NET 刷新父頁面 (ASP.NET Refresh Parent Page after Closing Modal Dialog Window)

無法將 NULL 值傳遞給數據庫 (Unable to pass NULL value to database)

wcf:將用戶名添加到消息頭是否安全? (wcf: adding username to the message header is this secure?)

使用 ASP.Net 教初學者 Web 開發的小項目想法 (Small projects ideas to teach beginners web development using ASP.Net)

SQL Server - 分組、擁有和計數 (SQL Server - Group by, having and count in a mix)

企業庫異常處理應用程序塊和日誌記錄應用程序塊在 ASP.NET 中的正確使用 (Enterprise Library Exception Handling Application Block and Logging Application Block proper use in ASP.NET)

來自proc的asp.net多個結果集:是否有必要將結果映射到類?如果是這樣,怎麼做? (asp.net multiple result set from proc: is it necessary to map results to class? If so, how?)

如何在測試工具中實例化 asp.net 代碼隱藏類? (How can I instantiate an asp.net codebehind class in a test harness?)

Web 窗體用戶控制事件,需要在頁面加載後添加 (Web Form User Control Event, needs to be added after page loads)







留言討論