Solved

Thread safe?

Posted on 2001-07-31
9
571 Views
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
{
   public:
      int m_refcount;
}

class MyObjectListMgr
{
   public:
      MyObject * getObject(int index);
   private:
      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.

Thanks,
Mike.
0
Comment
Question by:mnewton022700
9 Comments
 
LVL 86

Expert Comment

by:jkr
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 http://support.microsoft.com/support/kb/articles/Q125/6/77.asp ('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'.
0
 
LVL 30

Expert Comment

by:Axter
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.
See:
CreateFileMapping
OpenFileMapping
MapViewOfFile
UnmapViewOfFile

You can create a MapView that doesn't use a file by calling CreateFileMapping() function with hFile of (HANDLE)0xFFFFFFFF
0
 
LVL 22

Accepted Solution

by:
nietod earned 200 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.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

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

 
LVL 3

Author Comment

by:mnewton022700
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.
0
 
LVL 22

Expert Comment

by:nietod
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...
0
 
LVL 86

Expert Comment

by:jkr
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...
0
 
LVL 22

Expert Comment

by:nietod
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.
0
 
LVL 86

Expert Comment

by:jkr
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...
0
 
LVL 22

Expert Comment

by:nietod
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?  :-)
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
The viewer will learn how to use NetBeans IDE 8.0 for Windows to connect to a MySQL database. Open Services Panel: Create a new connection using New Connection Wizard: Create a test database called eetutorial: Create a new test tabel called ee…
The viewer will learn how to use and create keystrokes in Netbeans IDE 8.0 for Windows.

860 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