I think you want the contructor of PooledThread to initialize the event _targetCompleted to false rather than the default true. The false will cause all intances waiting on the event to be signaled when the thread is done.
On linux 2.6, my threadpool would constantly hang until I made this change. Now it works great.
I like how you do the threading.