Boost logo

Boost Users :

Subject: Re: [Boost-users] functor for boost::thread_group threads: which one is correct?
From: Boost lzw (boostlzw_at_[hidden])
Date: 2009-08-23 21:39:38


Hi Steven and other guys,

Thanks for Steven's input. Is the following code correct?
class FileThread
{
public:
    void find() { std::cout << "FileThread::find() called" << std::endl;}
    void print() { std::cout << "FileThread::print() called" << std::endl;}
};

class group_helper
{
private:
    boost::shared_ptr<FileThread> m_object;
public:
    group_helper() : m_object(boost::shared_ptr<FileThread>(new FileThread))

             { std::cout << "group_helper::ctor called" << std::endl;}
    void operator()() { m_object->find(); m_object->print(); }
    ~group_helper() { std::cout << "group_helper::***dtor called" <<
std::endl; }
};

int main()
{
    group_helper gp;
    boost::thread_group threads;
        for (int i = 0; i < 1; ++i)
            threads.create_thread(gp);
        threads.join_all();

    return 0;
}
===========
Output: 1 call to "group_helper::ctor called"
    6 calls to "group_helper::***dtor called"
===========
If the code is correct, does this mean that with thread_group we can no
longer expect the # of ctors matches that of the dtors in threaded code?

Thanks in advance,
Robert

On Sun, Aug 23, 2009 at 3:06 PM, Steven Watanabe <watanabesj_at_[hidden]>wrote:

> AMDG
>
> Boost lzw wrote:
>
>> I have two versions (VERSION1 and VERSION2) of a group_helper functor to
>> be
>> called from boost::thread_group, which one of them is correct?
>>
>> class FileThread
>> {
>> public:
>> void print() {...}
>> void find() {...}
>> };
>>
>> class group_helper
>> {
>> private:
>> boost::shared_ptr<FileThread> m_object;
>> public:
>> //VISION1
>> group_helper(boost::shared_ptr<FileThread>& object) : m_object(object)
>> {
>> }
>>
>> //VISION2
>> group_helper() : m_object(boost::shared_ptr<FileThread>(new
>> FileThread))
>> { }
>>
>> void operator()() { m_object->find(); m_object->print(); }
>> };
>>
>>
>
> Both are correct depending on whether you want to pass an external
> FileThread
> or create a new FileThread in the constructor.
>
> On another matter, why the following code results in a runtime exception
>> from the group_helper's dtor?
>>
>> #include <iostream>
>> #include "boost/thread/thread.hpp"
>>
>> class FileThread
>> {
>> public:
>> void find() { }
>> void print() { }
>> };
>>
>> class group_helper
>> {
>> private:
>> FileThread* m_object;
>> public:
>> group_helper() : m_object(new FileThread) {}
>> void operator()() { m_object->find(); m_object->print(); }
>> ~group_helper() { if (m_object) delete m_object; }// EXCEPTION from
>> dtor
>> };
>>
>>
>
> group_helper is copied and both copies try to
> delete m_object.
>
> int main()
>> {
>> group_helper gh;
>> boost::thread thrd(gh);
>> thrd.join();
>> }
>>
>>
>
> In Christ,
> Steven Watanabe
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net