4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
|
||||||||||||||||||||||||||
1 | ||||||||||||||||||||||||||
Область видимости общей переменной для потоков + закрытие потоков07.06.2017, 00:22. Показов 2457. Ответов 5
Метки нет Все метки)
(
Есть два вопроса про потоки.
Первый. Как можно сделать общую переменную для основного потока и моих ?
0
|
|
07.06.2017, 00:22 | |
Ответы с готовыми решениями:
5
Общение пхп потоков, есть ли область видимая для всех пхп потоков? Задать область видимости переменной для всех форм Открытие-закрытие потоков |
Ушел с форума
![]() |
|
07.06.2017, 01:03 | 2 |
Сделай volatile соответствующее поле структуры, а не саму структуру.
Либо используй atomic из Boost или std. Закрыть? Хм, ну CloseHandle ведь никто не отменял...
0
|
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
|
|
07.06.2017, 01:08 [ТС] | 3 |
минут через 10 после публикации пришел к этому )
Закрытие дескриптора не завершает сам поток. Или что-то другое имелось ввиду ?
0
|
Ушел с форума
![]() |
|
07.06.2017, 01:17 | 4 |
А, ты об этом... Ну тогда надо в поток отправить какой-то сигнал, чтобы он
вернул управление системе. Это правильный путь. TerminateThread ведет к "провалу всей операции", ибо поток прибивается в совершенно неопределенный момент, где, например, могут удерживаться блокировки и т.д.
0
|
4 / 4 / 2
Регистрация: 24.05.2013
Сообщений: 300
|
|
07.06.2017, 01:36 [ТС] | 5 |
Убежденный, что за сигнал ? Как ?
Для моего потока это зайдет, там где на цикле проверяется флаг выхода. Но в любом другом случае же будет сложнее, надо будет периодически проверять флаг выхода. С TerminateThread проблема только в том, что он не закрывает основной поток, но закрывает потоки, от которых зависит основной. (я их не создавал) Может быть можно проверить как-то можно ли закрыть поток (наличие флага THREAD_TERMINATE) . Либо же хранить список ХАНДЛОВ моих потоков, в закрытии которых (без исключений) я уверен. Добавлено через 7 минут + если поток переведен в режим SuspendThread(), то выйти из него его же средствами не выйдет. Добавлено через 3 минуты + сейчас такая ситуация, что я имею некоторое число потоков, которые я создал. Я это число знаю. Все потоки в режиме Suspended. К моим потокам прибавляется основной и еще несколько потоков, которые я не добавлял, но они есть. Как правило от 1 до 4. Как в данной ситации правильно закрыть все мои потоки ? Просто гулять по всему списку потоков и пробуждать их все, чтобы они могли сами по флагу выйти - я не могу. Как отличить мой от не моих...?
0
|
Ушел с форума
![]() |
|
07.06.2017, 09:40 | 6 |
![]() Решение
Да хоть event, хоть глобальная переменная...
Поток, получив такой сигнал, должен выйти из функции. Тогда он завершится. Это ЕДИНСТВЕННЫЙ корректный способ завершения потока, других не существует (и не нужно даже пытаться лепить какие-то "костыли" - оно не будет корректно работать). Ну разумеется. А зачем тогда делать SuspendThread? Это вообще функция для отладки и прочих специальных вещей, в 99% нормального софта таких функций не должно быть. См. выше. Нужно дать потокам какой-то сигнал на завершение. А затем дождаться, пока все соответствующие хэндлы не перейдут в сигнальное состоение. Другого пути нет. Значит, меняй архитектуру программы. Потому что иначе ничего не получится.
1
|
07.06.2017, 09:40 | |
Помогаю со студенческими работами здесь
6
Принудительное закрытие потоков Закрытие потоков ввода/вывода Закрытие формы с остановкой потоков
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |