Although it's perfectly legitimate to synchronize on an anonymous object like this, I'm really not a fan of doing so, because it's inefficient compared to a real lock – not only because it results in an additional object allocation, but because the associated monitor is created lazily (and the synchronization thus has to handle that case).

Anyways, this specific case could be replaced with OSAtomic functions – namely, a counter which is 1 or 2 when signals still need to complete, and then zero when they finally have.