Author: Robert Pope
Date: 13:09:01 03/11/02
Go up one level in this thread
Ouch! It never occurred to me to check that. Since I can't ponder yet, it sits
waiting on a move from the opponent with
for(;;) {
if(inputWaiting) break;
}
Since it isn't a true I/O loop, I forgot all about it. Thanks, Bob.
On March 09, 2002 at 10:59:38, Robert Hyatt wrote:
>On March 08, 2002 at 09:17:44, Robert Pope wrote:
>
>>On March 08, 2002 at 00:27:18, Robert Hyatt wrote:
>>
>>>
>>>One _very_ bad thing CM used to do was poll for input in a tight loop when
>>>it was sitting waiting on a move (not pondering). This meant that it would
>>>burn 50% of the CPU while the _other_ program was thinking. This was a
>>>bad bug several years ago, and I have no idea if it was ever fixed or not.
>>>
>>>If not, that _might_ be what is being discussed. A tight "got any input?"
>>>loop is NFG when the engine could simply block on a read() call... which
>>>would burn no CPU at all.
>>
>>This is actually the very problem I have with my own chess engine - it uses 100%
>> CPU on its move an 50% CPU on the opponent's move, just because of polling.
>>This is my first multi-threaded app, so I'm not sure how to fix this (blocking,
>>etc.). I thought my code would not be so hoggy because the polling thread would
>>stop at the fgets() and wait for input, but apparently not.
>
>
>fgets() must block since it can't proceed until the I/O has been completed.
>And I doubt any C library would implement this as a polling loop.
>
>But what is your _other_ thread doing when it has nothing to do? Is _it_
>polling waiting on the I/O thread to read a move and pass it over?
>
>
>
>>
>>Is there a simple fix for this? Here is the function that the thread runs (via a
>>_beginthread call):
>>
>>void InputThread(void* threadno)
>> {
>> char strIn[256];
>> inputThreadActive++;
>> for(;;) {
>> inputWaiting=false;
>> stringIn[0]=10;
>> fgets(strIn,255,stdin);
>> int i;
>> for (i=0;i<256;i++) {
>> stringIn[i]=strIn[i];
>> }
>> inputThreadActive--;
>> inputWaiting=true;
>> for(;;) {
>> if((!inputWaiting)||(endInputThread)) break;
>> }
>
>
>What is the purpose for that loop? Any such loop will burn CPU resources
>until the necessary condition for exit is reached. You should can any
>"loops" that wait for some condition (here !inputwaiting) because that will
>smoke the CPU. In posix threads, I would use a condition variable and
>wait on it instead, which blocks. Another thread can set such a condition to
>cause this thread to unblock if it wants...
>
>Not sure how to do that in windows however... but it is obviously possible.
>
>
>
>
>
>> if(endInputThread) break;
>> }
>> printf("thread ending");
>> _endthread();
>> }
>>
>>I wanted to keep all my threading simple and in one place, but not at its
>>current cost!
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.