You have to be very careful. He's why: // Bad code!!! void ThreadRoute1( void* arg ) { int *pInt = reinerpret_cast<int*>(arg); // Use 'pInt' here... } // Call to start thread. { int v = 1; _beginthread(ThreadRoute1, 0, reinterpret_cast<int*>(&v)); } // After this point "v" no longer exists. This is a recipe for disaster because for all you know the parent thread can make it to the point where "v" is out of scope before it is accessed in the child thread. This is why I use new in my previous example. He's a reworked version. void ThreadRoute1( void* arg ) { int *pInt = reinerpret_cast<int*>(arg); // Use pInt. delete pInt; } // Call to start thread. int *pInt = new int(1); if ( _beginthread(ThreadRoute1, 0, reinterpret_cast<void*>(pInt)) == -1 ) { delete pInt; } Steve