А>Но весь ужас ситуации в том, что как только отрабатывает первая строчка внутри А>
s->>Method();
А>
А>Вызывается деструктор cObject и вылетает error, что std::bad_alloc in memory ... . А>Что тут не так и как это убить ?
Так поток выполняется одновременно с потоком в котором main работает. Если в том потоке удалить s до того как ThreadFun завершит исполнение, то — s удалится, было бы странно еслиб не удалялся Соответственно надо пересматривать логику удаления s.
ExitThread кстати не нужен.
А>Но весь ужас ситуации в том, что как только отрабатывает первая строчка внутри А>
s->>Method();
А>
А>Вызывается деструктор cObject и вылетает error, что std::bad_alloc in memory ... . А>Что тут не так и как это убить ?
выполнение функции после А> CreateThread(..., (LPTHREAD_START_ROUTINE) ThreadFun, s, ...);
продолжается и объект object уничтожается по выходе из функции main, либо создай его ручками через new, либо копируй объект и передавай в поток копию, а еще лучше применить нормальный механизм межпоточного взаимодействия, в зависимости от контекста задачи
Ты передаешь в поток указатель на локальный объект, который разрушается к тому времени, когда поток пытается осуществить доступ к нему.
Лечить, например, так:
cObject * o = new cObject();
CreateThread(..., (LPTHREAD_START_ROUTINE) ThreadFun, s, ...);
Само собой нужно не забыть удалить объект в функции ThreadFun.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Многопоточность и CreateThread
От:
Аноним
Дата:
11.11.08 11:13
Оценка:
Во спасибо народ))
Только у меня такой еще вопросик родился.
Допустим, что нажав Кнопку1 я создал тот поток и он с бесконечным циклом.
Но вот он мне надоел и я захотел его убить. Какой функцией это сделать если его HANDLE сохранен
Говорили, что TerminateThread лучше не юзать, но вроде бы он для этого и создан.
Или же нет??
Здравствуйте, Аноним, Вы писали:
А>Во спасибо народ))
А>Только у меня такой еще вопросик родился. А>Допустим, что нажав Кнопку1 я создал тот поток и он с бесконечным циклом. А>Но вот он мне надоел и я захотел его убить. Какой функцией это сделать если его HANDLE сохранен А>Говорили, что TerminateThread лучше не юзать, но вроде бы он для этого и создан. А>Или же нет??
Единственный способ корректно завершить тред — это выйти из его ThreadFunc обычным return'ом. Так что лучше всего ваш бесконечный цикл превратить в
while (WaitForSingleObject(StopEvent, 0) == WAIT_TIMEOUT)
{
.....
}
return 0; // <- когда снаружи сделают SetEvent, цикл прервется и здесь будет корректный выход из треда.
Здравствуйте, alzt, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Но весь ужас ситуации в том, что как только отрабатывает первая строчка внутри А>>
s->>>Method();
А>>
А>>Вызывается деструктор cObject и вылетает error, что std::bad_alloc in memory ... . А>>Что тут не так и как это убить ?
A>Чтобы не гадать — в таком коде
A>int main() A>{ A> ... A> cObject object; A> cObject * o = & object; A> CreateThread(..., (LPTHREAD_START_ROUTINE) ThreadFun, s, ...); A> Sleep(100000); A> ... A>} A>[/ccode]
A>тоже деструктор сразу вызывается?
в данном случае он вызывается при выходе из функции main
[ccode]
{
...
cObject object;
...
// возврат из функции и вызов деструктора
}
/ccode]
Кроме вышеперечисленных бросается в глаза еще один баг:
ThreadFun должна быть определена с модификатором WINAPI,
иначе будут проблемы со стеком.
Вообще, для совместимости с рантайм-библиотеками, лучше использовать
_beginthread или _beginthreadex (и колбэк там как раз в стиле cdecl)
Re[2]: Многопоточность и CreateThread
От:
Аноним
Дата:
11.11.08 12:24
Оценка:
Ситуация чуть изменилась
теперь один поток создается и работает нормально, но вот второй уже вызывает ошибку, причем на этот раз просто говорит, что ошибка по адресы без всяких комментов. Причем эта ошибка происходит из-за того самого деструктора, только теперь уже на 2й объект... Если так пойдет, то гдето на 100 потоке я убью себя, а скорее и раньше
>Вообще, для совместимости с рантайм-библиотеками, лучше использовать >_beginthread или _beginthreadex (и колбэк там как раз в стиле cdecl)
Врядли получится, т к libcmt пришлось отключить — конфликт с подлюченными сторонними.
Насчет евента понял — поковыряю — главное знать, что ковырять))
Вот сразу вопрос родился гляда на WAIT_TIMEOUT — должен быть задан или же может быть unlim?
Здравствуйте, Аноним, Вы писали:
А>Ситуация чуть изменилась А>теперь один поток создается и работает нормально, но вот второй уже вызывает ошибку, причем на этот раз просто говорит, что ошибка по адресы без всяких комментов. Причем эта ошибка происходит из-за того самого деструктора, только теперь уже на 2й объект... Если так пойдет, то гдето на 100 потоке я убью себя, а скорее и раньше
>>Вообще, для совместимости с рантайм-библиотеками, лучше использовать >>_beginthread или _beginthreadex (и колбэк там как раз в стиле cdecl)
А>Врядли получится, т к libcmt пришлось отключить — конфликт с подлюченными сторонними.
А>Насчет евента понял — поковыряю — главное знать, что ковырять)) А>Вот сразу вопрос родился гляда на WAIT_TIMEOUT — должен быть задан или же может быть unlim?
Почитай в msdn про WaitForSingleObject. И, скажем, у Рихтера — про многопоточное программирование под виндой.
Если функция main закончится раньше чем ThreadFun, то позовется ExitProcess, который завершит все второстепенные потоки.
Если время жизни 'object' больше чем ThreadFun, то можно смело передавать его адрес в поточную функцию.