циклы
От: kot--  
Дата: 11.09.06 12:23
Оценка:
камрады, где ошибка (про ДНК молчать!)

значит такой код

for(i = 0;!TracStopEvent;i++)
{printf(" waiting for trac init !!! #%d\n",i);}

этот глобальный TracStopEvent=true; устанавливается в другом потоке.

выдает на печать вот такое:

waiting for trac init !!! #0
waiting for trac init !!! #1
waiting for trac init !!! #2
waiting for trac init !!! #3
waiting for trac init !!! #4
waiting for trac init !!! #5
waiting for trac init !!! #6
waiting for trac init !!! #6

почему "6" два раза ? я что-то совсем не понимаю он же выходит из цикла по "когда True", откуда еще одна печать [censored]!

p.s. MS VC++6sp6. почему не пользую события типа SetEvent и WaitForSingleObject — лучше пока не спрашивайте
---------------
c уважением, мохнато-полосатый kot--
Re: циклы
От: rft  
Дата: 11.09.06 12:28
Оценка:
K>почему "6" два раза ? я что-то совсем не понимаю он же выходит из цикла по "когда True", откуда еще одна печать [censored]!

Может быть у тебя где-то в программе 2 потока с аналогичным кодом запускаются, поэтому и два раза цифра 6.
Re[2]: циклы
От: kot--  
Дата: 11.09.06 12:34
Оценка:
Здравствуйте, rft, Вы писали:

K>>почему "6" два раза ? я что-то совсем не понимаю он же выходит из цикла по "когда True", откуда еще одна печать [censored]!


rft>Может быть у тебя где-то в программе 2 потока с аналогичным кодом запускаются, поэтому и два раза цифра 6.


нет, два не запускаются
---------------
c уважением, мохнато-полосатый kot--
Re: циклы
От: apple-antonovka  
Дата: 11.09.06 12:37
Оценка:
А если TracStopEvent объявить volatile?
Re[2]: циклы
От: kot--  
Дата: 11.09.06 12:59
Оценка:
Здравствуйте, apple-antonovka, Вы писали:

AA>А если TracStopEvent объявить volatile?


так же. тут дело не в том — эта переменная меняется, но почему в цикле вылезла еще одна печать !? ее не должно быть — ведь выход из цикла осуществляется при проверке!
---------------
c уважением, мохнато-полосатый kot--
Re[3]: циклы
От: apple-antonovka  
Дата: 11.09.06 13:07
Оценка:
Ниче не вылазит:
bool TracStopEvent = 0;
void __cdecl thread(void *p)
{
    Sleep(1);
    TracStopEvent = 1;
}

int main(int argc, char* argv[])
{
    _beginthread(thread,0,NULL);
    for(int i = 0;!TracStopEvent;i++) 
    {printf(" waiting for trac init !!! #%d\n",i);}
    return 0;
}


D:\Projects\testapp\Release>testapp.exe
 waiting for trac init !!! #0
 waiting for trac init !!! #1
 waiting for trac init !!! #2
 waiting for trac init !!! #3
 waiting for trac init !!! #4
 waiting for trac init !!! #5
 waiting for trac init !!! #6
 waiting for trac init !!! #7
Re[4]: циклы
От: kot--  
Дата: 11.09.06 13:38
Оценка:
Здравствуйте, apple-antonovka, Вы писали:

AA>Ниче не вылазит:

AA>
AA>bool TracStopEvent = 0;
AA>void __cdecl thread(void *p)
AA>{
AA>    Sleep(1);
AA>    TracStopEvent = 1;
AA>}

AA>int main(int argc, char* argv[])
AA>{
AA>    _beginthread(thread,0,NULL);
AA>    for(int i = 0;!TracStopEvent;i++) 
AA>    {printf(" waiting for trac init !!! #%d\n",i);}
AA>    return 0;
AA>}


AA>D:\Projects\testapp\Release>testapp.exe
AA> waiting for trac init !!! #0
AA> waiting for trac init !!! #1
AA> waiting for trac init !!! #2
AA> waiting for trac init !!! #3
AA> waiting for trac init !!! #4
AA> waiting for trac init !!! #5
AA> waiting for trac init !!! #6
AA> waiting for trac init !!! #7
AA>


у меня тоже не вылазит(собрал 2005)

но в проекте вылазит все равно. в принципе не страшно, но не понятно почему (((((
---------------
c уважением, мохнато-полосатый kot--
Re[5]: циклы
От: Аноним  
Дата: 11.09.06 15:31
Оценка:
K>но в проекте вылазит все равно. в принципе не страшно, но не понятно почему (((((

У любой ошибки должна быть причина. В 99% случаях, как мне кажется, можно найти причину ошибки, правда может быть потребуется много времени.
Re[5]: циклы
От: apple-antonovka  
Дата: 11.09.06 18:46
Оценка: 1 (1)
Код этот конечно ужасный и неправильный, но прикол любопытный
1) если цикл закоментить этот нафиг — ниче не пишет?
2) debug версия проекта так же глючит?

if ( !1 && !2) Неисключено что компилятор какимто образом соптимизировал цикл, не ожидая изменения TracStopEvent извне между двумя какимито точками кода. Не мешает привести асмовый листинг сгенеренного кода. В любом случае следует использовать ивент для ожидания инициализации второго потока.
Re[2]: циклы
От: kot--  
Дата: 12.09.06 06:21
Оценка:
Здравствуйте, apple-antonovka, Вы писали:

Через события ?

т.е.

1. создать событие.

hTracStopEvent = CreateEvent(NULL,false,false,"tracevent");

2. остановиться и отслеживать

WaitForSingleObject(hTracStopEvent,INFINITE);
ResetEvent(hTracStopEvent);

3. а в потоке вместо глобальной переменной сделать так:

SetEvent(hTracStopEvent);

верно ?
---------------
c уважением, мохнато-полосатый kot--
Re[3]: циклы
От: apple-antonovka  
Дата: 12.09.06 12:00
Оценка:
Да. Причем хэндл на событие стоит делать тоже не глобальным а передаваемым в поток через его параметр. И задавать имя для ивента совсем не обяхательно. Примерно чтото вроде (сорри если не компилицца, так набрал):

 
class ThreadParameters
{
private:
 HANDLE _init_event,_detached_event;

public:
 ThreadParameters():
 _init_event(::CreateEvent(NULL,FALSE,FALSE,NULL)),
 _detached_event(::CreateEvent(NULL,FALSE,FALSE,NULL))
  {
  }

 virtual ~ThreadParameters()
  {
  assert(::WaitForSingleObjectEvent(_init_event,0)==WAIT_OBJECT_0);
  ::WaitForSingleObjectEvent(_detached_event,INFINITE);
  ::CloseHandle(_init_event);
  ::CloseHandle(_detached_event);
  } 

 void SetThreadInitialized()
  {
  ::SetEvent(_init_event);
  }

 void WaitThreadInitialized()
  {
  ::WaitForSingleObjectEvent(_init_event,INFINITE);
  ::SetEvent(_detached_event);
  }
};

class CustomThreadParameter : public ThreadParameters
{
...тут еще специфичные для данного треда параметры

}
...


void __cdecl thread(void *p)
{
 CustomThreadParameter *params = (CustomThreadParameter *)p;//или smart pointer какой
 .........
 params->SetThreadInitialized();
 try
  {
........
  }
 catch(ThreadTerminationException &e)
  {
  }
 delete params;
}

.........
CustomThreadParameter *params = new CustomThreadParameter(some,additional,arguments)
assert(_beginthread(thread,0,params)!=NULL);
params->WaitThreadInitialized();
...забыли про params
Re: циклы
От: ArtDenis Россия  
Дата: 13.09.06 16:30
Оценка:
Здравствуйте, kot--, Вы писали:

K>камрады, где ошибка (про ДНК молчать!)


Думаю, приведённого кода недостаточно, чтобы сказать что-нибудь определённое
... << RSDN@Home 1.1.4 stable rev. 510>>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
Re[3]: циклы
От: _doctor Финляндия http://agilesoftwaredevelopment.com
Дата: 14.09.06 05:42
Оценка:
Здравствуйте, kot--, Вы писали:

AA>>А если TracStopEvent объявить volatile?


K> так же. тут дело не в том — эта переменная меняется, но почему в цикле вылезла еще одна печать !? ее не должно быть — ведь выход из цикла осуществляется при проверке!


Неизвестно как именно компилятор соптипизировал твой код. Попробуй volatile ( http://www.ddj.com/dept/cpp/184403766 )
Ещё можешь попробовать скомпилировать с отключённой оптимизацией. Если баг больше проявляться не будет, скорее всего он — дело рук оптимизатора, не знающего о том, что ты собираешься многопоточить.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Chief Software Engineer,
Scrum Master, Symbian
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.