Improve company productivity with a Business Account.Sign Up


Thread safe?

Posted on 2001-07-31
Medium Priority
Last Modified: 2013-12-14
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.

Question by:mnewton022700
LVL 86

Expert Comment

ID: 6339076
>>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'.
LVL 30

Expert Comment

ID: 6339166
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
LVL 22

Accepted Solution

nietod earned 800 total points
ID: 6340149
>>  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.
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.


Author Comment

ID: 6342721
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.
LVL 22

Expert Comment

ID: 6342793
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...
LVL 86

Expert Comment

ID: 6344799
>>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...
LVL 22

Expert Comment

ID: 6345479
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.
LVL 86

Expert Comment

ID: 6345493
>>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...
LVL 22

Expert Comment

ID: 6345518
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?  :-)

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

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.

Join & Write a Comment

Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
Many modern programming languages support the concept of a property -- a class member that combines characteristics of both a data member and a method.  These are sometimes called "smart fields" because you can add logic that is applied automaticall…
The goal of the tutorial is to teach the user how to use functions in C++. The video will cover how to define functions, how to call functions and how to create functions prototypes. Microsoft Visual C++ 2010 Express will be used as a text editor an…
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

595 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question