A mutual exclusion semaphore does have to be released by the same thread that obtained it. That's the way they work: a single thread acquires the lock on a resource so it can manipulate it and then, when it's finished, it releases that lock so that other threads may lock it.
The whole point of the "mutual exclusion" bit is that the thread with the lock has total power - only it can release that lock. That still allows the mutex to work across multiple threads because it can be owned by any one of them across its lifetime.
A named mutex allows a single mutex to also work across processes as well as threads. The name is used to allow a separate process to "connect" to an already-created mutex and it can then be used to control access to a resource across all connected processes.
For cross-thread communication like you desire, you're looking at something like a condition variable, which is used to signal threads that a condition has been met - I think the equivalent in .Net is the Monitor, with its Wait and Pulse methods.