Hmm, how very strange One thing, the nasty casting to AFX_THREADPROC isn't really a good idea, change your function prototypes to be UINT ThreadProc(LPVOID) and then cast the void paramter to the correct type in the thread. What platform are you using (as in VS.NET/VC6)? Also, try in your SlowThread just calling critsection->Lock() (ie doing away with the CSingleLock class) what happens then?