Threads and Static Data
Sean Kelly
sean at f4.ca
Thu Dec 13 07:49:27 PST 2007
Craig Black wrote:
> "Regan Heath" <regan at netmail.co.nz> wrote in message
> news:fjqu5t$2dvs$1 at digitalmars.com...
>> 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
>
> What you suggest will not work if plug-in A was created by company A and
> plug-in B was created by company B. They know nothing about each other and
> do not release source code. Inheritance is not a good solution here.
>
> A system that would work is one where the base thread class has a static
> container of object factories. Then each plug-in could submit their object
> factory to the base thread class. Then, object factory A could instantiate
> class A to support plug-in A, and object factory B could instantiate class B
> to support plug-in B, etc. The object factories would be called whenever a
> thread is instantiated.
>
> Most likely, the ThreadLocal template in Tango probably uses a system
> similar to this. I'm not sure about the details though.
It's a bit simpler than this right now. It would be easy enough to let
the user provide delegates to auto-construct data on thread
initialization, but given that these could throw, I'm hesitant to do so.
Sean
More information about the Digitalmars-d
mailing list