/* Under deeper inspection of your code, I'd like to edit it for better cross-platform support of the threading macros in tcl.h. Honestly, casting of function types is evil. Especially the calling convention part. I don't think I'm being nit-picky because the compiler will emit different different machine code for __cdecl and __stdcall. Try it and look at the difference of the stack handling of the listing .asm file. */ #define TCL_THREADS 1 #include #ifdef _MSC_VER # ifdef _DEBUG # pragma comment (lib, "tcl" STRINGIFY(JOIN(TCL_MAJOR_VERSION,TCL_MINOR_VERSION)) "dt.lib") # else # pragma comment (lib, "tcl" STRINGIFY(JOIN(TCL_MAJOR_VERSION,TCL_MINOR_VERSION)) "t.lib") # endif #endif Tcl_ThreadCreateType ThreadMainProc(ClientData clientData) { int *I = (int *) clientData; *I = 0; // if Tcl_ExitThread() is not called, Tcl_FinalizeThread() isn't // called either. That can lead to a large resource leak depending // on how much of the Tcl API is initialized. Tcl_ExitThread(0); // This just makes the compiler happy. TCL_THREAD_CREATE_RETURN; } int main(int argc, char *argv[]) { int I = 1; Tcl_ThreadId* ThreadId = NULL; Tcl_FindExecutable(argv[0]); // At this point the number of handles is 14 and of threads 1. if( Tcl_CreateThread( ThreadId, ThreadMainProc, &I, TCL_THREAD_STACK_DEFAULT, TCL_THREAD_NOFLAGS ) != TCL_OK) { return 1; // Error handle } // This loop is finished by the thread. // At this point the number of handles is 15 and of threads 2. while( I ) printf( "%d", I ); // At this point the number of handles is 15 and of threads 1, i.e. the thread is dead. return 0; }