2017-03-01 36 views
5

std::promise<T> için std::mutex örneğinde olduğu gibi mutable yapılıyor mu, yoksa T mu? olduğu gibi: yöntemlerdenStd :: Promise <T> iş parçacığı güvenli midir?

// 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); 

Yok const işaretli olduğu için biz sadece bundan constness hakkında herhangi bir bilgiye tahmin edemediği:

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

Bu model, gelecekteki sıfırlanamayan nedenlerden dolayı bozuk çıkıyor. Future.get() 'un bunu sıfırlayacağını düşünürdüm ama değil. Tüm bu vaat/geleceğin konularını gerçekten görmeye çalışıyorum. – James

cevap

4

en API ayrıntılı bir göz atalım. Bununla birlikte, standart, aşağıdaki yöntemlerde (örnek: 33.6.6.2 sayılı belge): set_­value, set_­exception, set_­value_­at_­thread_­exit ve set_­exception_­at_­thread_­exit. İplik güvenliği açısından belirtilmemiş get_future belirtilmemiş. Ancak, get_future, birden fazla çağrılırsa bir istisna atar, c.f. 33.6.6.14.1. Bu nedenle, birden çok iş parçacığından get_future numaralı çağrı, pratik bir bakış açısından gerçekten anlam ifade etmiyor. get_future ve herhangi set yöntemlerinin ve get_future çağrılırken

parçacığı güvenliği için garantisi yoktur (olursa olsun atmak veya olmaz ise) bildiğim kadarıyla gördüğünüz gibi, aynı anda.