Peter Dimov wrote:
> 
> Ken Hagan wrote:
> > Peter Dimov wrote:
> >>
> >> &k does not exist yet at compile-time (in a pointer to int form),
> >> when templates are instantiated.
> >
> > It doesn't have to. We're instantiating a template, not calling a
> > function, so if "&k" has the type "pointer to thread-local int" then
> > the compiler knows that and can instantiate the appropriate code.

Please define "appropriate code". Please see the added 2 lines below.

> 
> Indeed it can, and it (MSVC 7.1b) even does. I stand corrected.
> 
> #include <iostream>
> #include <typeinfo>
> #include <windows.h>
> #include <process.h>
> #include <boost/detail/lightweight_mutex.hpp>
> 
> typedef boost::detail::lightweight_mutex mutex_type;
> mutex_type m;
> 
> template<uintptr_t * p> struct C
> {
>     void f()
>     {
>         std::cout << " p: " << p << ": " << *p << std::endl;
          static const uintptr_t * P = p;
          std::cout << " P: " << P << ": " << *P << std::endl;
>     }
> };
> 
> __declspec(thread) uintptr_t k = 0;
> 
> unsigned __stdcall f(void * pt)
> {
>     k = *(uintptr_t *)pt;
>     mutex_type::scoped_lock lock(m);
>     C<&k> ck;
>     ck.f();
>     std::cout << "&k: " << &k << ": " << k << std::endl;
>     return 0;
> }
> 
> int main()
> {
>     uintptr_t t1 = _beginthreadex(0, 0, f, &t1, 0, 0);
>     uintptr_t t2 = _beginthreadex(0, 0, f, &t2, 0, 0);
>     uintptr_t t3 = _beginthreadex(0, 0, f, &t3, 0, 0);
>     ::Sleep(250);
>     ::CloseHandle((HANDLE)t1);
>     ::CloseHandle((HANDLE)t2);
>     ::CloseHandle((HANDLE)t3);
> }

regards,
alexander.

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

Reply via email to