簡體   English   中英

響應需要其引用共享狀態的std :: shared_future的OWN COPY的線程

[英]Reacting threads needing its OWN COPY of the std::shared_future that refers to the share state

我有一個關於有效現代C ++第270頁的問題,由Scott Meyers編寫。

在第5/6行,他寫道:“唯一的微妙之處在於,每個反應線程都需要自己擁有的std :: shared_future自己的COPY,它指的是共享狀態,......”

我的問題是:為什么我們有義務將std::shared_future的副本傳遞給每個線程中的每個lambda函數? 雖然先驗,我沒有看到通過引用傳遞它的任何問題,這樣有一個獨特的共享狀態將由不同的線程使用?

我寫了一本改編自斯科特邁耶斯博士的書的代碼,即使我通過了參考文獻,也可以使用。

因此,是否可以通過引用傳遞它?

#include <future>
#include <vector>

std::promise<void> p;

void react(){}

void detect()
{
    auto sf = p.get_future().share();

    std::vector<std::thread> vt;
    int n=10;
    for(int i=0;i < n; i++)
    {
        vt.emplace_back([sf]{sf.wait();
        react();
                        });
    }

p.set_value();

for(auto& t : vt)
    t.join();


}

int main()
{
    detect();
    return 0;
}

如果通過引用傳遞,則多個線程正在訪問shared_future的同一實例。 這可能導致數據競爭並且是未定義的行為。 如果多個線程通過自己的shared_future副本訪問共享狀態,則庫會確保它們已同步。

get上的cppreference頁面說:

它有效地調用wait()以等待結果。

並且waitcppreference頁面說:

從多個線程調用相同的std::shared_future是不安全的; 預期用途是在等待相同共享狀態的每個線程上擁有std::shared_future的副本。

暫無
暫無

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

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