Posted 03 November 2011 - 06:05 AM
You're changing the gIsPaused state in the input handling thread and check the value each loop iteration in the 3 rendering threads. As in C++ no operations are atomic (at least not before C++11), you should create a mutex array for your 3 boolean states and lock each of them while checking and while writing.
Concerning your main problem, does it matter which window is paused? E.g. whether it's a configuration such that the 2 active windows are on the same monitor while the paused one is on the other? Might be that in this case they are fighting for the context more than with 3 windows enabled (and would thus be an error that's not easy to reproduce).
EDIT: Ok sorry I didn't read the NVIDIA post properly at first. Next hint is that you might want to create 3 different textures (so glGenTextures in the initialization of each thread, and then bind that texture if that thread is current. This way you prevent having any problems with OpenGL reallocating a different sized texture in video memory every time). Not sure whether that fixes your problems though.
Unfortunately I don't have a second monitor to test with twin view here (and no full fledged linux machine either), but a general hint about your multithreading: