$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Howard Hinnant (hinnant_at_[hidden])
Date: 2003-07-01 08:15:11
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