2016-07-15 9 views
1

shared_futuresでこれを行うことができるかどうかを知りたいと思っていました。 本質的に私は約束を参照する2つのスレッドを持っています。 スレッドのいずれかが、その出力を処理し、残りのスレッドからの別の割り当てをリッスンすることに戻すことを望みます。このようなことをすることはできますか?get future with get

void tA(std::promise<string>& p) 
{ 
    .... 
    std::string r = "Hello from thread A"; 
    p.set_value(std::move(r)); 
} 

void tB(std::promise<string>& p) 
{ 
    ... 
    std::string r = "Hello from thread A"; 
    p.set_value(std::move(r)); 
} 

int main() { 
std::promise<std::string> inputpromise; 
std::shared_future<std::string> inputfuture(inputpromise.get_future()); 

//start the thread A 
std::thread t(std::bind(&tA,std::ref(inputpromise)); 

//start the thread B 
std::thread t(std::bind(&tA,std::ref(inputpromise)); 

std::future<std::string> f(p.get_future()); 

std::string response = f.get(); ------> Will this unblock when one thread sets a value to the promise and can i go back listening for more assignments on the promise ? 

if(response=="b") 

response = f.get(); -->listen for the assignment from the remaining thread 
} 

答えて

2

あなたはpromise::set_value(またはset_exceptionのような任意の同等の機能)を複数回呼び出すことはできません。約束は、スレッド間で共有されるこのような方法では使用されません。約束を所有するスレッドが1つあり、約束が満たされているかどうかを判断できる1つ以上の場所があり、そうであれば値を取得します。

お約束は、あなたが望むことをするための正しいツールではありません。未来/約束は、より一般的なツールの特別なケースです。つまり、並行キューです。真の並行キューでは、スレッドがキューに値をプッシュします。受信スレッドはキューから値を抽出できます。未来/約束は基本的に単一要素キューです。

単一要素のキューではなく、一般的な同時キューが必要です。残念ながら、標準ライブラリにはこのライブラリがありません。