threads further testing
- Posted by jacques deschĂȘnes <desja at globetrotter.net> Jul 10, 2006
- 528 views
I made more testing of threads in euphoria. if I run my test code with exw.exe it crash. if I run it with exwc.exe it run nice. I tested writting to console using puts() an nothing is printed to screen but not crash. I replaced puts() by win32api function WriteConsole() and it works fine. temporary conclusions: 1)if one avoid call to statically linked C run time functions from threads it works. 2) exwc.exe seem to be thread safe but not exw.exe. 3) So one can write multi-threaded console apps in euphoria platform tested on: windows xp sp2 euphoria interpreter: exwc.exe version 2.5 my last test code:
-- testing windows system threads in euphoria without warning include wildcard.e include misc.e include machine.e include dll.e constant kernel32=open_dll("kernel32.dll") if kernel32 = -1 then puts(1,"failed to open kernel32.dll\n") abort(1) end if constant CREATE_SUSPENDED = 4, STD_OUTPUT_HANDLE = -11 constant iCreateThread=define_c_func(kernel32,"CreateThread",{C_POINTER,C_UINT,C_POINTER,C_POINTER,C_UINT,C_POINTER},C_UINT), iSleep=define_c_proc(kernel32,"Sleep",{C_UINT}), iCloseHandle = define_c_func(kernel32,"CloseHandle",{C_UINT},C_UINT), iResumeThread = define_c_func(kernel32,"ResumeThread",{C_UINT},C_UINT), iGetStdHandle = define_c_func(kernel32,"GetStdHandle",{C_UINT},C_UINT), iWriteConsole = define_c_func(kernel32,"WriteConsoleA",{C_UINT,C_POINTER,C_UINT,C_POINTER,C_POINTER},C_UINT) global function CreateThread(atom lpThreadAttributes, atom dwStackSize, -- initial thread stack size, in bytes atom lpStartAddress, -- pointer to thread function atom lpParameter, -- argument for new thread atom dwCreationFlags, -- creation flags atom lpThreadId -- pointer to returned thread identifier ) return c_func(iCreateThread,{lpThreadAttributes,dwStackSize,lpStartAddress,lpParameter,dwCreationFlags,lpThreadId}) end function --CreateThread() global function CloseHandle(atom handle) return c_func(iCloseHandle,{handle}) end function -- CloseHandle() global procedure Sleep(integer ms) c_proc(iSleep,{ms}) end procedure global function GetStdHandle(atom nStdHandle) return c_func(iGetStdHandle,{nStdHandle}) end function global procedure WriteConsole(atom hConsole, sequence text) atom void, pText, pCharWritten pText = allocate_string(text) pCharWritten =allocate(4) void = c_func(iWriteConsole,{hConsole,pText,length(text),pCharWritten,0}) free(pText) free(pCharWritten) end procedure object fnVal atom counter, spinlock function IncCounter(atom param)-- thread function (increment couter global variable) atom stdout stdout = GetStdHandle(STD_OUTPUT_HANDLE) -- handle not inherited, get it from parent process. WriteConsole(stdout,"writing to console from IncCounter thread\n") while 1 do if spinlock = 1 then counter +=1 if counter = 10 then spinlock = 2 return 0 end if -- thread termination spinlock = 0 else --sleep(500) this does not work propably call static linked crt function. Sleep(500) win32api wrapper work end if end while end function atom lpStartAddress lpStartAddress = call_back(routine_id("IncCounter")) atom lpThreadId lpThreadId = allocate(4) atom lpParam lpParam = allocate(4) poke4(lpParam,0) atom hThread hThread = CreateThread(0,0,lpStartAddress,lpParam,0,lpThreadId) printf(1,"thread handle %d\n", hThread) if not hThread then puts(1, "echec creation thread\n") abort(0) end if counter = 0 spinlock = 0 while spinlock < 2 do if not spinlock then ? counter spinlock = 1 end if end while fnVal = CloseHandle(hThread)
regards, Jacques DeschĂȘnes