Boost logo

Boost :

Subject: [boost] [task] functor passed to a boost::task::task not always destroyed?
From: Harald Winroth (hwinroth_at_[hidden])
Date: 2009-08-25 05:48:11


I wrote a short test program to check that each copy construction of a
functor passed to a boost::task::task
and boost::task::async was balanced by a corresponding destructor
call. This is indeed the case when the
task is run in a thread pool but it seems as if one destructor call is
missing when the task is submitted to
to boost::task::async with a boost::task::new_thread execution policy.

Here is the a short test program and the resulting output. For
comparison, the same functor is also passed
directly to a boost::thread, which behaves as expected. The program
was compiled using Visual C++ 2005 (SP1),
and boost 1.39.0 with the latest Boost.Task library from the vault dropped
in.

Any ideas? Am I missing something?

Best regards
Harald

--- Output:

Running Runnable as a task
Runnable() [0012FF57]
Runnable(const Runnable&) [0012FE88]
Runnable(const Runnable&) [0012FE40]
Runnable(const Runnable&) [00463B9C]
~Runnable() [0012FE40]
~Runnable() [0012FE88]
Runnable::operator() [00463B9C]
~Runnable() [0012FF57]
Running Runnable directly on a thread
Runnable() [0012FF33]
Runnable(const Runnable&) [0012FE8C]
Runnable(const Runnable&) [0012FE5C]
Runnable(const Runnable&) [0012FDDC]
Runnable(const Runnable&) [001541D8]
~Runnable() [0012FDDC]
~Runnable() [0012FE5C]
~Runnable() [0012FE8C]
Runnable::operator() [001541D8]
~Runnable() [001541D8]
~Runnable() [0012FF33]

--- Test program:

#include <boost/thread.hpp>
#include <boost/task.hpp>
#include <iostream>

void print(const std::string& s, void* instance = 0) {
 static boost::mutex mutex;
 boost::lock_guard<boost::mutex> guard(mutex);
 std::cout << s;
 if (instance) std::cout << " [" << instance << "]";
 std::cout << std::endl;
}

struct Runnable {
 Runnable() { print("Runnable()", this); }
 Runnable(const Runnable&) { print("Runnable(const Runnable&)", this); }
 ~Runnable() { print("~Runnable()", this); }
 void operator()() { print("Runnable::operator()", this); }
};

int main() {
 {
   print("Running Runnable as a task");
   Runnable r;
   boost::task::handle<void> h =
boost::task::async(boost::task::make_task(r),
boost::task::new_thread());
   h.wait();
 }
 {
   print("Running Runnable directly on a thread");
   Runnable r;
   boost::thread thread(r);
   thread.join();
 }
 return 0;
}


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk