2017-03-01 6 views
5

std::mutexとした場合のように、mutableとなるか、それともTに依存しますか?以下のように:std :: promise <T>はスレッドセーフですか?

using Data = std::tuple<bool, int, int>; 

struct X { 

    std::future<Data> prepare() const { 
     return m_promise.get_future(); 
    } 

    void asyncHandler(int a, int b) const { 
     m_promise.set_value({true, a, b}); 
    } 

    void cancel() const { 
     m_promise.set_value({false, 0, 0}); 
    } 

    mutable std::promise<Data> m_promise; // Is this safe? 
}; 


void performAsyncOp(const X& x) { 
    std::future<Data> fut = x.prepare(); 
    dispatch(x); 
    std::future_status result = fut.wait_for(std::chrono::milliseconds(150)); 
    if (result == std::future_status::timeout) { 
     x.cancel(); 
    } 

    handleResult(fut.get()); 
} 
+0

このパターンは、先物がリセット不可能なためにとにかく壊れていることが判明しました。私はfuture.get()がそれをリセットしたと思っていただろうが、それはしない。私はこの約束/将来の事実のポイントを本当に見て苦労しています。 – James

答えて

4

のは、APIを詳しく見てみましょう:メソッドの

// retrieving the result 
future<R> get_future(); 

// setting the result 
void set_value(see below); 
void set_exception(exception_ptr p); 

// setting the result with deferred notification 
void set_value_at_thread_exit(see below); 
void set_exception_at_thread_exit(exception_ptr p); 

いずれもconstとマークされていないので、私たちはちょうどこのからconst性についての知識を推測することはできません。ただし、この標準では、以下のメソッド(c.f. 33.6.6.2):set_­value,set_­exception,set_­value_­at_­thread_­exitおよびset_­exception_­at_­thread_­exitのスレッドセーフティが要求されています。

これは、スレッドセーフに関してはget_futureを指定していません。しかし、get_futureは複数回呼び出されると例外をスローします.cf 33.6.6.14.1。したがって、get_futureを複数のスレッドから呼び出すことは、実用的な観点からは実際には意味をなさない。

私の知る限り、同時に(それは投げたりしない場合に関係なく)get_futuresetのいずれかの方法とget_futureを呼び出すスレッドの安全性のための保証はありません。

関連する問題