View mode: basic / threaded / horizontal-split · Log in · Help
August 17, 2001
Thread Specific Storage
I always thought a nice feature missing from C/C++ was a storage class
for thread specific storage. For instance:

	perthread int x;

would declare an int that had a unique instance in every thread created.
Very easy to implement (just reserve space on the thread's stack before
jumping to the thread's function), but nobody's miplemented it - the
only thread-specific storage interface is the ugly POSIX thing with
unique keys and all sorts of lookups.
August 17, 2001
Re: Thread Specific Storage
Microsoft has an extension which does this in C++
__declspec(thread)

as well as an API for Thread Local Storage.

Cheers,
Matt.

"Michael Lindner" <mikell@optonline.net> wrote in message
news:3B7C8487.89994CFC@optonline.net...
> I always thought a nice feature missing from C/C++ was a storage class
> for thread specific storage. For instance:
>
> perthread int x;
>
> would declare an int that had a unique instance in every thread created.
> Very easy to implement (just reserve space on the thread's stack before
> jumping to the thread's function), but nobody's miplemented it - the
> only thread-specific storage interface is the ugly POSIX thing with
> unique keys and all sorts of lookups.
August 17, 2001
Re: Thread Specific Storage
Look at the LX thread. To me, that's an instance of the general class of
"pragmas". In LX:

   {thread_specific} int X

There are so many such cases that you don't want it to be part of the
language. To wit, LX language-defined pragmas exist for:

   linkage (Asm, C, etc)
   argument passing conventions
   size and bit size (of fields in structs)
   address of object, or offset in struct
   alignment
   width of memory accesses (*see note 1*)
   memory space for accessing an entitty (I/O, data, for a MC68000, 16, 24
or 32-bit space, etc)
   inlining (specified either at declaration site or call site)
   thread-specific storage
   synchronous access in multi-threaded environments
   symbol to be exported or imported from a DLL
   near or far pointers
   structure packing
   optimization levels
   Whether arguments are passed by value or by reference
   Whether a value has to live in a register, and optionally, in which
register
   Linkage sections (.text, .data, .init_text, etc)
   Whether an object is used only at initialization or only at exit time

And I'm probably forgetting a few. The important point is: the general syntax
and framework allows this list to be extended as needs to be.


(*note 1*) As a programmer of real time systems, I once ran accross the
following interesting problem. Assume ptr is a pointer to a volatile 16-bit
int, I was doing:

   *ptr |= 8

The Microsoft compiler decided: well, 8 fits on 8 bits, right, so I can go
ahead and do a 8-bit OR. Too bad, ptr was pointing to some VME-bus bridge
that took 16-bit accesses and byte-swapped them for me (VME being
good-endian, while x86 is bad-endian). The byte-swapping hardware did not
trigger on the 8-bit access, and I ended up flipping the wrong bit. Talk
about a pain to debug ;-)


Christophe

Matthew Versluys wrote:

> Microsoft has an extension which does this in C++
> __declspec(thread)
>
> as well as an API for Thread Local Storage.
>
> Cheers,
> Matt.
>
> "Michael Lindner" <mikell@optonline.net> wrote in message
> news:3B7C8487.89994CFC@optonline.net...
> > I always thought a nice feature missing from C/C++ was a storage class
> > for thread specific storage. For instance:
> >
> > perthread int x;
> >
> > would declare an int that had a unique instance in every thread created.
> > Very easy to implement (just reserve space on the thread's stack before
> > jumping to the thread's function), but nobody's miplemented it - the
> > only thread-specific storage interface is the ugly POSIX thing with
> > unique keys and all sorts of lookups.
Top | Discussion index | About this forum | D home