[M3devel] Per thread data

Tony Hosking hosking at cs.purdue.edu
Tue Sep 14 18:48:22 CEST 2010


Ah, sorry. I misunderstood.  Sounds like we need a thread-local pragma <*LOCAL*>?

On 14 Sep 2010, at 08:59, Jay K wrote:

> Tony -- then why does pthread_get/setspecific and Win32 TLS exist?
> What language doesn't support heap allocation were they designed to support?
> It is because code often fails to pass all the parameters through all functions.
>  
> Again the best current answer is:
>   #ifdefed C that uses pthread_get/setspecific / Win32 TlsAlloc/GetValue/SetValue, ignoring user threads/OpenBSD.
>  
> As well, you'd get very very far with merely:
> #ifdef _WIN32
> __declspec(thread)
> #else
> __thread
> #endif
>  
> Those work adequately for many many purposes, are more efficient, much more convenient, and very portable.
> I believe there is even an "official" C++ proposal along these lines.
>  
> We could easily abstract this -- the first -- into Modula-3 and then support it on user threads as well.
> Can anyone propose something?
> It has to go in m3core, as that is the only code that (is supposed to) know which thread implementation is in use.
>  
>  - Jay
> 
>  
> > From: darko at darko.org
> > Date: Tue, 14 Sep 2010 05:34:59 -0700
> > To: hosking at cs.purdue.edu
> > CC: m3devel at elegosoft.com
> > Subject: Re: [M3devel] Per thread data
> > 
> > That's the idea but each object can only call another object allocated for the same thread, so it needs to find the currently running thread's copy of the desired object.
> > 
> > On 14/09/2010, at 5:08 AM, Tony Hosking wrote:
> > 
> > > If they are truly private to each thread, then allocating them in the heap while still not locking them would be adequate. Why not?
> > > 
> > > On 14 Sep 2010, at 01:08, Darko wrote:
> > > 
> > >> I have lots of objects that are implemented on the basis that no calls on them can be re-entered, which also avoids the need for locking them in a threaded environment, which is impractical. The result is that I need one copy of each object in each thread. There is approximately one allocated object per object type so space is not a big issue. I'm looking at a small number of threads, probably maximum two per processor core. With modern processors I'm assuming that a linear search through a small array is actually quicker that a hash table.
> > >> 
> > >> On 13/09/2010, at 9:55 PM, Mika Nystrom wrote:
> > >> 
> > >>> Darko writes:
> > >>>> I need to have certain data structures allocated on a per thread basis. =
> > >>>> Right now I'm thinking of using the thread id from ThreadF.MyId() to =
> > >>>> index a list. Is there a better, more portable way of allocating on a =
> > >>>> per-thread basis?
> > >>>> 
> > >>>> Cheers,
> > >>>> Darko.
> > >>> 
> > >>> In my experience what you suggest works just fine (remember to lock the
> > >>> doors, though!) But you can get disappointing performance on some thread
> > >>> implementations (ones that involve switching into supervisor mode more
> > >>> than necessary when accessing pthread structures).
> > >>> 
> > >>> Generally speaking I avoid needing per-thread structures as much as possible
> > >>> and instead put what you need in the Closure and then pass pointers around.
> > >>> Of course you can mix the methods for a compromise between speed and
> > >>> cluttered code...
> > >>> 
> > >>> I think what you want is also not a list but a Table.
> > >>> 
> > >>> Mika
> > >> 
> > > 
> > 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20100914/c1208444/attachment-0002.html>


More information about the M3devel mailing list