Код этот конечно ужасный и неправильный, но прикол любопытный
1) если цикл закоментить этот нафиг — ниче не пишет?
2) debug версия проекта так же глючит?
if ( !1 && !2) Неисключено что компилятор какимто образом соптимизировал цикл, не ожидая изменения TracStopEvent извне между двумя какимито точками кода. Не мешает привести асмовый листинг сгенеренного кода. В любом случае следует использовать ивент для ожидания инициализации второго потока.
Здравствуйте, rft, Вы писали:
K>>почему "6" два раза ? я что-то совсем не понимаю он же выходит из цикла по "когда True", откуда еще одна печать [censored]!
rft>Может быть у тебя где-то в программе 2 потока с аналогичным кодом запускаются, поэтому и два раза цифра 6.
нет, два не запускаются
---------------
c уважением, мохнато-полосатый kot--
Здравствуйте, apple-antonovka, Вы писали:
AA>А если TracStopEvent объявить volatile?
так же. тут дело не в том — эта переменная меняется, но почему в цикле вылезла еще одна печать !? ее не должно быть — ведь выход из цикла осуществляется при проверке!
---------------
c уважением, мохнато-полосатый kot--
Да. Причем хэндл на событие стоит делать тоже не глобальным а передаваемым в поток через его параметр. И задавать имя для ивента совсем не обяхательно. Примерно чтото вроде (сорри если не компилицца, так набрал):
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
Здравствуйте, kot--, Вы писали:
AA>>А если TracStopEvent объявить volatile?
K> так же. тут дело не в том — эта переменная меняется, но почему в цикле вылезла еще одна печать !? ее не должно быть — ведь выход из цикла осуществляется при проверке!
Неизвестно как именно компилятор соптипизировал твой код. Попробуй volatile ( http://www.ddj.com/dept/cpp/184403766 )
Ещё можешь попробовать скомпилировать с отключённой оптимизацией. Если баг больше проявляться не будет, скорее всего он — дело рук оптимизатора, не знающего о том, что ты собираешься многопоточить.