Fix unit test which uses an invalid unowned lock release

This pattern might work on certain systems, but it's actually not correct to release a lock from anywhere except the thread which originally obtained that lock.  For synchronization in this fashion, a barrier or a conditional variable is preferred--a conditional variable is used here for portability.  Unfortunately, in this case, a total guarantee that the async is waiting is not possible--a short thread sleep is used instead to provide a one-sided error guarantee in this test.