Threads and Static Data

Regan Heath regan at netmail.co.nz
Thu Dec 13 01:31:39 PST 2007


Craig Black wrote:
> "Regan Heath" <regan at netmail.co.nz> wrote in message 
> news:fjmigm$vhf$1 at digitalmars.com...
>> Sean Kelly wrote:
>>> Regan Heath wrote:
>>>> Craig Black wrote:
>>>>> "Regan Heath" <regan at netmail.co.nz> wrote in message 
>>>>> news:fjjtr4$6g2$1 at digitalmars.com...
>>>>>> Sean Kelly wrote:
>>>>>>> Craig Black wrote:
>>>>>>>> Suite!  I think I've seen the term "thread local", but it never 
>>>>>>>> occured to me what it meant.  Goes to show you how green I am when 
>>>>>>>> it comes to threading.  I'll check it out.  Thanks.
>>>>>>> For what it's worth, some C/C++ compilers have "thread local" as a 
>>>>>>> storage class.  I've proposed adding this to D before, but there 
>>>>>>> seemed to be no interest at the time.
>>>>>> If I want thread local storage I just add the variables as static 
>>>>>> members of the class I've derived from Thread.
>>>>>>
>>>>>> Does thread local storage give us some advantage over that?
>>>>>>
>>>>>> R
>>>>> Storing all your static data for everything in a thread class is not 
>>>>> ideal from a software design perspective IMO.
>>>> Why not?
>>>>
>>>> The way I see it members of a thread class are essentially the same 
>>>> thing as global variables in a program.
>>>>
>>>> The program is just the first thread, and it's member variables are 
>>>> global variables.
>>>>
>>>> The difference is that any thread you create has public access to the 
>>>> program/main threads member/global variables, which is actually worse in 
>>>> terms of encapsulation than using thread classes and member variables.
>>>>
>>>> So, I reckon if you want "a variable which is private to a thread" why 
>>>> not just make it a member of your thread class.
>>> A library designer doesn't always have the ability to dictate what goes 
>>> in a thread class, or necessarily even knows whether the library will be 
>>> used in a multithreaded program.
>> That's true, if the library uses global variables.  Otherwise you can 
>> stick the libraries data structures/classes/etc into the thread as 
>> members.
>>
>> Right?  Or am I missing something.
>>
>> Regan
> 
> Think of multiple plug-in librariess to an application.  The application is 
> responsible for creating the threads.  In order for the plug-ins to add 
> their respective thread local data to the thread class, they have to inherit 
> it.  So now plug-in A has class ThreadA and plugin B has class ThreadB. 
> Which class should the application instantiate to start a thread?

Well, I was assuming the plug in library had some class or struct and 
some methods or functions to call on those objects... but you're 
suggesting the plug in publishes a thread class?

That's a bit weird, but ok.  I would create a ThreadC (derived from the 
Thread base) class and have a reference to both ThreadA and ThreadB in 
it.  I then instantiate ThreadC for each thread I need, where the 
constructor for ThreadC instantiates but does not 'start' ThreadA or 
ThreadB.

So, each and every ThreadC object contains a copy of the data that 
ThreadA and ThreadB contain, or rather a copy of the data the plug in 
requires.

Regan



More information about the Digitalmars-d mailing list