Thread safe?

I have an ActiveX control that dynamically links to
another dll. This dll contains the following classes
which are defined in a cpp file (excuse the pseudo code):

class MyObject
      int m_refcount;

class MyObjectListMgr
      MyObject * getObject(int index);
      LIST m_myObjectList;

// Global static instance.
static MyObjectListMgr myObjectListMgr;

// In the same file another exposed class makes use of
// myObjectListMgr list this...

void AnotherClass::publicExposedMethod()
   MyObject * myObject = myObjectListMgr.getObject(0);

   myObject->m_refCount = myObject->m_refCount + 1;

My questions are:
   * If two of my controls are loaded by one application,
or by two different applications, then will they both be
using the exact same instance of myObjectListMgr?
   * Is this code thread-safe? If not, what are the
possible consequences?

I'm using Visual C++ 6.0 by the way.

Who is Participating?
>>  No, the instantiation of global objects in a DLL is done on a
>> per-process basis, so every process 'sees'
Jus to calrify this because that "no" is missleading.   If two different programs use the DLL, they do not share the global objkects and thus do not share the same list manager.   But if two controls are loaded by one program, they will share global objects and the same list manager.  Similarly two threads in seperate processes will not be accessing the same list manager or any other global object.  But two threads in the same process will be accessing the same list manager and other global objects.

>> Another idea would be to use MapView functions to create a
>> single buffer that can be shared among the multiple processes
Thsi is assuming that your goal is to try to make this extremely difficult to make thread safe.

However, if you want to make it thread safe without making it tought on yoruself, I would continue to not share memory between applications  However that alone is not enough to make it thread safe, but it menas yoiu can use critical sections to synchronize access instead of mutexes,   This will make your syncrhonizations much much faster.

I see that your code uses reference counting.  If reference counted objects can be shared between threads (and in general they can, you would have to take special precautions to be sure they don't.) then you must synchronize access to the reference count.  i.e. whenever an object's reference count is incremented or decremented, you need to do this from inside a critical section that protects the reference count.  Otherise the count could be corrupted and you will get memory leaks or you will get cases where an object is deleted 2 or more times.

I don't know what LIST is in

  LIST m_myObjectList;

but if it is some sort of linked list, and if this linked list will be used by more than one thread, then again you need to use it only from within a critical section.   If you fail to do this, two threads might alter the list at the same time and corrupt it, or one might search the llst while another modifies it and the search might terminate early or never end.   Bad stuff.
>>My questions are:
>>  * If two of my controls are loaded by one application,
>>or by two different applications, then will they both be
>>using the exact same instance of myObjectListMgr?

No, the instantiation of global objects in a DLL is done on a per-process basis, so every process 'sees' it's own instance (note that ActiveX and DLL are interchangeable here). However, you could share a data area (not a class) in a shared data segment of the DLL - see ('HOWTO: Share Data Between Different Mappings of a DLL')

>>  * Is this code thread-safe? If not, what are the
>>possible consequences?

That's not easy to say, as it depends on the ramifications of the code that's being called. The 'safest' (because pessimistic) answer is 'no'.
Another idea would be to use MapView functions to create a single buffer that can be shared among the multiple processes, threads, & Applications.

You can create a MapView that doesn't use a file by calling CreateFileMapping() function with hFile of (HANDLE)0xFFFFFFFF
Cloud Class® Course: MCSA MCSE Windows Server 2012

This course teaches how to install and configure Windows Server 2012 R2.  It is the first step on your path to becoming a Microsoft Certified Solutions Expert (MCSE).

mnewton022700Author Commented:
So not thread-safe then... I was pretty sure it wasn't, but I don't have a good handle on threads...

Thanks to jkr and Axter also.
Multi-threading is often covered in genreal in Advanced programming text books.  

Lots of windows programming books will also have a chapter or two devioted to multi-threading too.  But be careful, some may just describe the features that windows provides for helping with multi-threading, but assume that you alrady have an understanding of the multi-threading issues--which is more important and far from obvious.  There is at least one book, Win32 Multi-threaded programming, by Cohen and Woodring, on the subject.

Sorry, jkr, once again not answering a question leads to such a fair result...
>>So not thread-safe then...

That's not for sure... I'd tend to say 'YES', but the snippet of code you provided isn't enought to thell that...
I'd tend to say no.  I see no prevent that the referecne count and list will from being altered simmulataneously by 2 or more threads.  

Now there is no evidence that 2 or more threads could not do thiat at the same time.  So if this code is used by only one thread, then it is safe, but I suspect that is not true.  I suspect that 2 or more threads can be using this code and this will be unsafe as it is.
>>I'd tend to say no

We seem to be a case of double negations here, as with "I'd tend to say 'YES'", I meant to agree to "not thread-safe" :o)

But, 'LIST' still could be a list type with serialized access...
Actually its a partial double negation, since we're not sure... So its like -1 + +0.9, which leaves -0.1.  So...What does that mean?  :-)
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.