Sure enough, turning the global variable into a parameter solved the problem. I feel good about debugging this issue (especially since it wasn't my code), but I have to thank Jeff, who first got me thinking that one thread was corrupting the others.
The moral of the story, of course, is that global variables are almost always a bad idea, and that you should have a really good reason for using them -- particularly in a multithreaded environment.
Thanks to everyone for the excellent help!