| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Не срабатывает поток |
| Автор: rudolfninja 25.10.2013, 14:40 | ||||
| Доброго времени суток. Сразу к вопросу: Есть класс, в котором функцией run создается три потока. Потоки выполняют статические функции класса. В статическую функцию передается указатель на экземпляр класса, который вызвал ее, чтоб можно было получить доступ к общим объектам. Первый поток выводит в текстовое поле строку (разделяемый ресурс), второй - заменяет в нем одну букву на другую, третий - вторую на первую
После этого кода выводится только результат работы потока "б->а", результата "а->б" не видно. Да и первый поток отрабатывает только определенное количество времени и потом перестает выполняться. Не подскажете, в чем может быть проблема? На всякий случай:
|
| Автор: Dem_max 25.10.2013, 14:56 | ||
Ну потому что такая конструкция
всегда будет вызывать дедлок для другого потока Добавлено через 2 минуты и 53 секунды На почитай от и до конца http://wm-help.net/books-online/book/59464/59464-27.html#h8 Добавлено через 3 минуты и 41 секунду http://wm-help.net/books-online/book/59464.html |
| Автор: xvr 27.10.2013, 19:55 |
Ну сама по себе не будет, а вот то, что потоки 2 и 3 молотят без передыху вполне может вызвать замораживание всего на свете 2 ТС: Вставь как минимум Sleep(...) в потоки 2 и 3 |
| Автор: rudolfninja 28.10.2013, 12:01 |
| Основная проблема была в том, что не вызывался InitializeCriticalSection и DeleteCriticalSection. Спасибо за помощь. |
| Автор: Dem_max 29.10.2013, 07:02 | ||
Ты все таки почитай предложенную мной книгу. |
| Автор: rudolfninja 29.10.2013, 08:16 |
Я прочитал и даже не раз. Правда, не очень понял, почему всегда будет вызываться дедлок. |
| Автор: GremlinProg 29.10.2013, 09:09 |
| Не будет там дедлока, но время работы этих двух потоков будет "слабопрогнозируемо", т.к. один из них может вытеснять к выполнению другой. Это приведет к тому, что тот, который был вытеснен будет простаивать на какой-то итерации неопределенное время. Из этого следует, что если какой-то "третий" поток будет опираться на результат работы вытесненного потока, то при синхронизации он будет вынужден так же простаивать. Сложится впечатление "дедлока". А класс таких ошибок с дедлоком один. |