std::promise
std::promise提供了一種在異步編程中傳遞值的機(jī)制。它通常與std::future一起使用,用于在一個線程中產(chǎn)生值,并在另一個線程中獲取該值。
std::promise允許一個線程(稱為 "提供線程")在某個時間點(diǎn)上設(shè)置一個值,而另一個線程(稱為 "獲取線程")可以在將來的某個時間點(diǎn)上獲取該值。這種機(jī)制允許線程之間進(jìn)行同步和通信,特別是在并發(fā)編程和異步編程的場景中非常有用。
std::promise類提供了一個成員函數(shù)set_value,它允許提供線程設(shè)置一個值。獲取線程可以通過std::future對象來獲取該值。
Case :

需要注意的是,std::promise和std::future一般用于單次的值傳遞。如果需要在多個線程之間進(jìn)行多次傳遞,可以考慮使用std::shared_future和std::shared_ptr。
std::shared_future
std::shared_future可以通過std::future的成員函數(shù)share顯式構(gòu)造,也可以由std::future對象隱式轉(zhuǎn)換而來。
std::future模型獨(dú)享同步結(jié)果的所有權(quán),是只移動的,成員函數(shù)get只能一次性獲取數(shù)據(jù),如果調(diào)用第二次將引發(fā)異常。而std::shared_future實例是可拷貝的,所以多個對象可以引用同一關(guān)聯(lián)期望值的結(jié)果。
對于每個獨(dú)立的std::shared_future對象,其成員函數(shù)調(diào)用返回的結(jié)果是非同步的。這意味著多個線程同時訪問同一個shared_future對象的成員函數(shù)可能導(dǎo)致數(shù)據(jù)競爭,因為這些函數(shù)可能會修改內(nèi)部狀態(tài)。為了避免數(shù)據(jù)競爭,必須使用鎖來保護(hù)對shared_future對象的訪問。
另外,建議優(yōu)先考慮的解決方法是為每個線程創(chuàng)建一個獨(dú)立的拷貝對象,而不是共享同一個對象。這樣,每個線程都擁有自己獨(dú)立的shared_future對象,可以通過這些對象獲取結(jié)果。由于每個線程都使用自己的拷貝對象,多個線程之間訪問共享同步結(jié)果就是安全的,不會發(fā)生數(shù)據(jù)競爭。
Case :
