Le 07/04/13 02:12, Klaim - Joël Lamotte a écrit :

On Sun, Apr 7, 2013 at 1:44 AM, Stefan Strasser <strasser@uni-bremen.de> wrote:
I was under the impression that the promise object itself has to be alive when the future result is used. and since you're emptying your queue on execution it's not.
but considering that the promise object could be in another thread that was probably a false impression.

I have doubts on this too. I think it is more useful for the promise and future to share the memory where the result will be set but not have a coupled lifetime.
But I can't confirm yet, I'll have to search in the standard or find a language lawyer or someone knowing the SL well.

Anyway, VC's std::promise/future seem to work as I intend in my test...
 
Which compiler does this even work with yet? Both gcc and clang fail. clang on compilation, gcc compiles it but fails at runtime with a system_error exception and an invalid error code.
so you might wanna consider compiler and library bugs, too.

I tested only on Visual Studio 2012 Update 2.
I don't see the problem with gcc/clang, could you provide error reports?
I don't have access to them.

However, here is a reproduction of the test but with a vector and std::future/promise: http://liveworkspace.org/code/2QT6d8$4
GCC 4.8 accepts it but not clang 3.2 apparently, but I believe it's a library implementation problem as the report point to std::chrono code that I don't even use directly.

I cant' use Boost.Thread V4 on LiveWorkspace so my tests on these compilers are limited.
Maybe just try http://liveworkspace.org/code/2QT6d8$4 but replace std::future and std::promise by boost::promise
and see if it compiles.
If it does, just add the WorkQueue code and replace the while loop by the call to execute, then you will have the exact code I'm testing.

The queue works itself have some tests that run correctly, so the only problem I have is with boost::future/promise in combination with the tbb::concurrent_queue.
As tbb::concurrent_queue don't allow move-only value type, I think that's the main difference with the  vector, in the use case of my test.

I really need some sleep now. Will get back to it tomorrow.

Hi,

I have tested your example on gcc-4.8.0 and clang-3.2 with libc++ and everything is ok. When I replace std::future/promise by boost::future/promise everything is ok also.

Maybe, there is a difference between the interface std::vector you use in this example and your WorkQueue. Could you provide the prototype of the functions you are using of WorkQueue?

Best,
Vicente