Kristian Spangsege
Kristian Spangsege

Reputation: 2973

Putting a mutex in a memory mapped file on windows in C/C++

Does Windows offer any kind of mutex that can be placed in a memory mapped file and used across multiple processes?

Ideally it must be completely self contained such that it can survive by itself in the file, even across a reboot. Also, no resources should be leaked if I simply remove the file manually while no processes are running.

If possible the solution should also offer the accompanying 'condition' concept which should also be an object that can sit in a shared memory mapped file.

In short, I need something similar to a PTHREADS mutex with the SHARED attribute.

As far as I understand, simply using a PTHREADS mutex is not possible because the SHARED attribute is unsupported in the Windows port of PTHREADS.

Upvotes: 3

Views: 3979

Answers (3)

Raymond Chen
Raymond Chen

Reputation: 45173

Use the file as its own mutex: Use the LockFileEx function and have everybody agree to lock byte 0 of the file when they want to claim the mutex.

Upvotes: 3

Hans Passant
Hans Passant

Reputation: 941625

That's not possible. The mutex object itself lives in kernel space to protect it from user code messing with its state. The handle you acquired to it is only valid for the process that acquired it. Technically you could use DuplicateHandle() and put the returned handle in the mmf, but only if you have a handle to the other process that accesses the memory section. That's fairly brittle.

This is why you can specify a name for the mutex in the CreateMutex() function. The other process gets to it by using the same name in the OpenMutex call.

Upvotes: 1

ixe013
ixe013

Reputation: 10171

To share a synchronization object, give it a name and use the same name in each process when you Create the object.

The following synchronization objects can be shared between process that way :

Critical sections cannot be shared, but are faster.

Testing or waiting on those objects is done with the wait family of functions, often WaitForMultipleObjects.

Upvotes: 3

Related Questions