Re: MT Design Question
"Chris M. Thomasson" <cristom@charter.net> wrote in message
news:Jfndo.83475$lS1.55496@newsfe12.iad...
"Chris M. Thomasson" <cristom@charter.net> wrote in message
news:Gcndo.83474$lS1.22226@newsfe12.iad...
[...]
DAMN! It appears that one has to call a timed wait with a timeout of zero
in order to perform a poll operation wrt the readiness of a future. Why
is `future<>::is_ready()' missing in this draft!?
Humm... Perhaps I speak too fast here Scott. I think I can totally get
around the fact that `future<>::is_ready()' does not seem to be included
in the current C++0x draft. It should be simple. Let me think for a
moment, and I will try to post a solution...
Something like this should be able to "work around the problem":
_______________________________________________________
struct complete
{
std::condition_variable m_cond;
std::mutex m_mutex;
};
// new data-structure...
template<typename T>
struct future_ex
{
std::future<T> m_future;
bool m_ready; // == false;
bool is_ready() const
{
return m_ready;
}
};
template<typename T>
struct promise_ex
{
std::promise<T> m_promise;
complete& m_complete;
/* new -> */ std::future_ex<T>& m_future_ex;
void set_value(T v)
{
m_complete.m_mutex.lock();
m_promise.set_value(v);
/* new -> */ m_future_ex.m_ready = true;
m_complete.m_mutex.unlock();
m_complete.m_cond.notify_one();
}
};
// new ... Changed all `std::future<T>' to `future_ex<T>'
template<typename T>
struct multi_wait
{
complete m_complete;
linked_list<future_ex<T>*> m_list;
void push_future(future_ex<T>* f)
{
m_list.push(f);
}
future_ex<T>* wait()
{
future_ex<T>* result = NULL;
m_complete.m_mutex.lock();
while (! m_list.is_empty())
{
for each future_ex<T>* in m_list as f
{
if (f->is_ready())
{
result = f;
m_list.pop(f);
goto bailout;
}
}
m_complete.m_cond.wait(m_complete.m_mutex);
}
bailout:
m_complete.m_mutex.unlock();
return result;
}
};
_______________________________________________________
Humm... I now have to explicitly extend futures and promises in order for
this `multi_wait<>' scheme to work out. Scott, is there truly no way to poll
a `std::future<>' for completion such that a subsequent call to
`std::future<>::get' will be 100% guaranteed to contain either a result or
an exception? What is that `std::future<>::valid' call all about!?
Confused again!
;^(...