1. threads further testing
- Posted by jacques deschênes <desja at globetrotter.net> Jul 10, 2006
- 557 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
2. Re: threads further testing
- Posted by Al Getz <Xaxo at aol.com> Jul 10, 2006
- 577 views
jacques deschênes wrote: > > > 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: > }}} <eucode> > -- 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) > </eucode> {{{ > > regards, > Jacques Deschênes Hi again Jacques, I tried again using exwc.exe and it ran ok one time out of about 6 or 7 runs so i gave up. That one time it did run however... When i build C code i have to specify to the compiler that it needs to be built with the multi threaded libraries. I think Rob would have to do that with exw or exwc also. It even says somewhere in the Windows doc's that in order to use the thread functions your program must have been built with the multi threaded option. I have no idea why it can run one time out of 6 and not the other 5 times however. Take care, Al E boa sorte com sua programacao Euphoria! My bumper sticker: "I brake for LED's" From "Black Knight": "I can live with losing the good fight, but i can not live without fighting it". "Well on second thought, maybe not."
3. Re: threads further testing
- Posted by jacques deschênes <desja at globetrotter.net> Jul 10, 2006
- 578 views
- Last edited Jul 11, 2006
Hi Al, Didn't crash yet on my PC. I'll do more testing and reading. Thanks for testing it. regards, Jacques Deschênes