2016-06-11 53 views
0

我已經實施了一個工作/任務系統。您可以創建function<void, void>並將其放置在線程本地隊列中,然後將函數包裝到光纖中。如何實現單個消息的消息傳遞?

現在,這件作品現在完全正常,但如果我不能返回值,它將是無用的。 function<T, void>

這意味着我需要一種方法來做消息傳遞。我這樣實現它:

我有一個Cell<T>它可以存儲一個變量,並有一個原子計數器。我採取了一個function<T, void>,包裝封閉。一旦函數執行完畢,它將寫入cell並遞減計數器。現在,當我創建closure時,我必須指向一個單元格,其中一個位於封閉內部,另一個位於外部。

關閉是function<void, void>類型,我也把它包裝在一個光纖中,並把它放在一個線程本地隊列中。

現在在任務系統之外,我可以檢查該單元是否計數器已遞減爲0.如果已知,task必須已完成,否則我必須等待。我只等待任務系統之外的主線程。在任務系統內部,我可以重新安排時間。

我之前沒有做過任何多線程編程,而這是我可以想象實現「消息傳遞」的唯一方法。

我很確定像我的Cell這樣的東西已經被髮明,但我不知道它的通用名稱是什麼。

這是實現消息傳遞的常用方法嗎?我的意思是「封閉一個cell並等待完成」。

我的Cell的正確名稱是什麼?有沒有可用的在線實現?

回答

1

有一種方法可以傳遞一條消息,它被稱爲「未來」。 「未來」是一個將在(將來)(將來)(即名稱)持有價值的對象,您可以輪詢(或等待)以獲取價值。在C++ 11中,它以std::future的形式存在。未來的發射端是promise

對於您的情況:

  1. 有人給出了一個std::function<T()>被安排執行
  2. 你在纖維包裝這個功能。雖然這樣做,你實際上應該在std::function<void()>第一包起來:

    std::promise<T> promise; 
    std::future<T> future = promise.get_future(); 
    std::function<void()> wrapped = [f, p = std::move(promise)]() 
    { 
        p.set_value(f()); 
    }; 
    // do stuff with 'wrapped' 
    return future; 
    
  3. 隨着未來返回你可以等待一個值(阻塞調用)或查詢時,它的價值是爲了知道。

獎勵:你也可以創建一個std::future<void>,在這種情況下,你仍然可以調用get()或靜止輪詢它;它將作爲完成該功能的信號。