You need one mutex by resource. The Mutex will control the access to that object, giving exclusive permission for a thread to modify it. If you have a list and a hash, for example, that will be shared by three threads, you'll need two mutexes: one for the list, and one for the hash. While a thread modifies the list, others can modify the hash, and so on. It's a good practice to always synchronise multiple mutexes in the same order, to prevent deadlocks.