Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Multithreading question

Author: Tony Werten

Date: 23:55:53 09/09/03

Go up one level in this thread


On September 09, 2003 at 14:23:46, Andreas Herrmann wrote:

>On September 09, 2003 at 04:10:53, Tony Werten wrote:
>
>>On September 09, 2003 at 03:21:34, Andreas Herrmann wrote:
>>
>>>On September 09, 2003 at 02:14:08, Tony Werten wrote:
>>>
>>>Hi Tony,
>>>
>>>i have just read inside a Delphi internals book last week a 50 side long capitel
>>>about Thread programming. It says that all local vars are save, but pay
>>>attention for global vars. See the help to the win api function
>>>EnterCriticalSection or the VCL object TCriticalSection as a good starting point
>>>to this theme.
>>>
>>>Andreas
>>
>>Thanks ( to all)
>>
>>It seems that "write" is not threadsafe when used for writing to the console. I
>>added some checks to make sure only 1 thread is writing at a time. Hope this
>>solves the problems.
>>
>>The problems became worse when I changed from writeln to write which seems
>>logic: more time spend in writing so bigger change for collisions.
>>
>>
>>Tony
>
>yes that can be a problem. I don't have this problem, because only my main
>thread (= the chess engine) writes to the standard output and my second thread
>polls the standard input and writes it to a own global buffer.
>
>Your problem could also be solved with Mutex (like Robert describes). See
>CreateMutex or OpenMutex for further help.

I took the cheapo way.

I made a global wb_busy boolean (set to false)

In the writefunction I first do "while wb_busy do sleep(20)"

then wb_busy:=true

and end the function with wb_busy:=false

It seems to work.

Everybody thanks, specially the person who wrote me a week ago that consoles
aren't threadsafe. Now I understand what he meant :(

Tony

>
>Andreas
>
>
>
>
>>
>>>
>>>
>>>
>>>>Hi,
>>>>
>>>>maybe a silly question, but one get quite desperate during debugging. Suppose I
>>>>have the followin code:
>>>>
>>>>procedure whatever(param:integer)
>>>>begin
>>>>   do_something_heavy_with_param;
>>>>end;
>>>>
>>>>Say, the heavy stuff takes about 10 seconds.
>>>>
>>>>If during these secs another thread is calling this function, what happens ?
>>>>
>>>>Does every thread gets a "local copy" of the function ?
>>>>
>>>>On a single processor, there is a context switch, stuff is pushed on a stack,
>>>>and everything is safe.
>>>>
>>>>What about a dual ? I get the feeling that param is actually changed by the
>>>>second call.
>>>>
>>>>Tony



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.