Se il mutex non è ricorsivo, potresti avere problemi se le due code sono lo stesso oggetto. La soluzione migliore penso sia controllare se sono lo stesso oggetto e in quel caso non fare nulla.
Sull'altro problema, ti lascio pensare un po'. Detto questo, è mia opinione che a livello di design del software ti dovresti chiedere se davvero vuoi che questa operazione sia atomica.