The basic technique that Eyal Schneider outlined in his answer is what my ConcurrentUnit library is intended to accomplish. The general usage is:
- Spawn some threads
- Have the main thread wait or sleep
- Perform assertions from within the worker threads (which via ConcurrentUnit, are reported back to the main thread)
- Resume the main thread from one of the worker threads once all assertions are complete
See the README on GitHub for more info.