On Monday, June 30, 2003, at 06:04 PM, Philippe A. Bouchard wrote:

Suppose you have:

struct functor1
{
        list<void *> m_list;

        void operator () ()
        {
                ...
        }
};

struct functor2
{
        list<void *> m_list;

        void operator () ()
        {
                ...
        }
};

int main()
{
        thread f1(functor1());
        thread f2(functor2());

...

// I would like to access m_list of the current thread's functor:

        lock()...
        if (thread() == f1 || thread() == f2)
        {
                thread()..(whatever casts)...m_list;
        }
        unlock()...

// I think the only way to do this is by mapping the thread's id
// with the object's address (map<key, functor1 *>) but there is
// no standard key publicly accessible and map<> creates overhead.
}

The tss facility *is* a map from the thread's id to any data you want. Perhaps your example could look like:


thread_specific_ptr<list<void*> > m_list;

void foo()
{
    // no lock necessary!
    // uses thread()'s private copy of list<void*>
    m_list->push_back(0);
    // ...
}

struct functor1
{
    void operator()()
    {
        m_list.reset(new list<void*>);
        // ...
        foo();
    }
};

struct functor2
{
    void operator()()
    {
        m_list.reset(new list<void*>);
        // ...
        foo();
    }
};

int main()
{
        thread f1(functor1());
        thread f2(functor2());
        // ...
}

Or were you wanting one thread to be able to access another thread's list<void*>? To be able to do that, I think you would have to create your own map.

-Howard

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to