Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
#1

Корректно убить поток - C++

21.10.2015, 09:42. Просмотров 805. Ответов 27
Метки нет (Все метки)

Пусть имеется поток thrdWork, который обрабатывает большие данные. В результате этой работы в памяти каждый раз сохраняются наиболее лучшие результаты. Т.к. эти результаты перезаписываются, то вывод их в файл возможен по окончанию обработки данных, что не реально долго (возможно и сутки, если не дольше). Поэтому я хочу выводить результаты по нажатию на клавишу (скажем мне будет достаточно того, что thrdWork уже нашел), но при этом дальнейшая обработка мне не нужна, т.е. поток нужно убить раньше времени. Я пришел к 2 решениям:

1 решение:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void Work()
{
   thread thrdWork(Processing);
   thrdWork.detach();
 
   char cmd;
 
   while (true) {
      cin >> cmd;
 
      if (cmd == 'd')
         // отладочная информация
         // сколько и с какими параметрами найдены
         writeDebugInfo();                
      else if (cmd == 'p') {
         writeBest();
         return;
      }
   }
}
 
 
//main
   thread thrd(Work);
   thrd.join();


и 2 способ:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// main
 
   vector<thread> v_thrd;
   v_thread.push_back(thread(Processing)); // thrdWork
 
   char cmd;
 
   while (true) {
      cin >> cmd;
 
      if (cmd == 'd')
         // отладочная информация
         // сколько и с какими параметрами найдены
         writeDebugInfo();                
      else if (cmd == 'p') {
         writeBest();
         v_thrd.clear();
      }
   }


Какой метод более корректен или есть решение получше,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2015, 09:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Корректно убить поток (C++):

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток)) - C++ Builder
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Убить процесс - C++ Builder
Кто ни будь знает как можно программно убить процесс ?

Убить процесс, зная имя.exe - C++ Builder
Всем привет!! Подскажите как убить процесс, зная его имя, есть вот такой примерчик: short KillThisProcess=0; HANDLE...

Бессмертная программа, которую невозможно (насколько это возможно) убить - C++ Builder
Всем доброго времени суток. Необходимо! Создать программу, которую невозможно (насколько это возможно) убить! В чем суть? Надеюсь...

Как убить процесс IExplore.exe (и все его дочерние процессы), запущеный командой ShellExecute? - C++ Builder
То есть, я сам запускаю експлорер, ShellExecute(0,&quot;open&quot;,&quot;IEXPLORE.EXE&quot;,&quot;http://192.168.0.11:8000/?action=System.Restart&quot;, &quot;&quot;,SW_HIDE); ...

Не корректно работает switch() case - C++ Builder
Мне нужно сделать switch case строк не подскажите как это реализовать? switch(Values-&gt;Strings)) { case &quot;a&quot;: break; case &quot;b&quot;: ...

27
nmcf
5324 / 4644 / 1553
Регистрация: 14.04.2014
Сообщений: 18,480
21.10.2015, 10:12 #2
Никакой. Нельзя прерывать поток принудительно. Ты же не знаешь, на какой стадии он прервётся, может, и данные будут некорректные после этого. Используй средства синхронизации, чтобы поток сам завершался при определённых условиях.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
21.10.2015, 10:38  [ТС] #3
Цитата Сообщение от nmcf Посмотреть сообщение
может, и данные будут некорректные после этого
даже если они будут писаться в глобальные?
0
nmcf
5324 / 4644 / 1553
Регистрация: 14.04.2014
Сообщений: 18,480
21.10.2015, 11:06 #4
Дело не в глобальности, а в целостности. Например, 2 переменные запишет, а третью не успеет - она будет старое значение содержать и т. п.
1
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
21.10.2015, 11:12  [ТС] #5
Согласен. Тогда каждый раз буду опрашивать переменную, отвечающую за завершение потока.
0
Renji
1925 / 1323 / 298
Регистрация: 05.06.2014
Сообщений: 3,810
21.10.2015, 11:32 #6
Если под Линуксом, то там есть pthread_cancel, вызывающий процесс схожий с броском исключения из вызванной в потоке cancellation point функции (без cancellation point не заработает). Под gcc этот "процесс" вроде как в исключение и преобразуется. Но вообще изврат, так как по сути выходит что сишные функции начинают плеваться исключениями.
0
quwy
Native x86
3247 / 2092 / 564
Регистрация: 13.02.2013
Сообщений: 6,983
21.10.2015, 11:34 #7
Цитата Сообщение от mat_for_c Посмотреть сообщение
Тогда каждый раз буду опрашивать переменную, отвечающую за завершение потока.
Только не забудьте объявить ее как volatile.
0
mat_for_c
143 / 138 / 29
Регистрация: 26.04.2013
Сообщений: 671
Завершенные тесты: 2
21.10.2015, 11:42  [ТС] #8
Цитата Сообщение от quwy Посмотреть сообщение
Только не забудьте объявить ее как volatile
Да, с эти я знаком уже
0
hoggy
6654 / 2842 / 487
Регистрация: 15.11.2014
Сообщений: 6,294
Завершенные тесты: 1
21.10.2015, 20:05 #9
никак.
единственный способ потоку корректно завершиться - умереть естественной смертью.

обычно делают так: потоки у себя в каком то цикле крутятся,
и проверяют неккий атомарный флажок.

если true, значит хотят закрыть лавочку снаружи.
и поток корректно брякается из своей функции.
0
Dmitriy_M
1356 / 1237 / 114
Регистрация: 20.03.2009
Сообщений: 4,429
Записей в блоге: 11
22.10.2015, 16:33 #10
Цитата Сообщение от quwy Посмотреть сообщение
Только не забудьте объявить ее как volatile.
Вы хотели сказать использовать атомики? Т.к. С++11 так не рекомендует делать.
0
quwy
Native x86
3247 / 2092 / 564
Регистрация: 13.02.2013
Сообщений: 6,983
22.10.2015, 17:08 #11
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Вы хотели сказать использовать атомики?
Достаточно переменной. Это не совсем по канонам, но если булевую переменную изменяет только один поток, то кто и как бы не читал ее, рассинхронизации не произойдет. Самое худшее что может произойти -- ожидающий сигнала поток провернет один лишний цикл вместо того, чтобы завершиться немедленно. Но это только в том случае, если запись значения в эту переменную по каким-то невероятным причинам окажется не атомарной.
0
Dmitriy_M
1356 / 1237 / 114
Регистрация: 20.03.2009
Сообщений: 4,429
Записей в блоге: 11
22.10.2015, 17:20 #12
Цитата Сообщение от quwy Посмотреть сообщение
рассинхронизации не произойдет.
Откуда такая уверенность?
0
quwy
Native x86
3247 / 2092 / 564
Регистрация: 13.02.2013
Сообщений: 6,983
22.10.2015, 17:28 #13
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Откуда такая уверенность?
Оттуда, что иной сценарий видится мне совершенно невозможным.

У вас есть другое мнение? Пожалуйста, высказывайтесь.
0
Dmitriy_M
1356 / 1237 / 114
Регистрация: 20.03.2009
Сообщений: 4,429
Записей в блоге: 11
22.10.2015, 17:44 #14
При использовании volatile в многопоточной среде никто ничего не гарантирует.
Более подробно смотрите cv (const and volatile) type qualifiers,Concurrency: Atomic and volatile in C++11 memory model
То что вы говорите это хаки завязанные на реализацию bool, volatile в конкретных компиляторах на конкретных архитектурах.
0
quwy
Native x86
3247 / 2092 / 564
Регистрация: 13.02.2013
Сообщений: 6,983
22.10.2015, 18:05 #15
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
То что вы говорите это хаки завязанные на реализацию bool, volatile в конкретных компиляторах на конкретных архитектурах.
Я сразу сказал, что это не по канонам, но мы вроде об конкретном языке говорим, а не философствуем на тему? Данное решение работает, и является надежным. Можно конечно вместо нормального BOOL написать свой, который будет хранить один бит информации в килобайтном объекте, изменять его в течении миллиона тактов процессора, допускать неопределенные состояния и делать прочие непотребства. Но раз речь об относительно низкоуровневом языке, то по-умолчанию подразумевается работа с базовыми типами данных. В любой из существующих архитектур биты под BOOL либо все равны нулю, либо не все равны нулю, неопределенных состояний нет, а volatile не дает компилятору так или иначе запихнуть переменную в контекст потока. В результате atomic тут не обязателен и при этом, в отличие от volatile, доступен не во всех компиляторах (это к вопросу о привязке к компилятору).
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2015, 18:05
Привет! Вот еще темы с ответами:

Корректно объявить и описать функции - C++ Builder
Function.h //--------------------------------------------------------------------------- #ifndef FunctionH #define FunctionH ...

Корректно загрузить содержимое файла - C++ Builder
Добрый день. Необходимо загрузить содержимое файла в мемо. Но проблема вот в чем: между фразами в строке присутствуют null байты, т.е....

Корректно взять числа со StringGrid - C++ Builder
Доброго времени суток. Не могу понять почему неправильно считает программа. Помогите пожалуйста. Код ...

WebBrowser не позволяет приложению корректно закрыться - C++ Builder
На форме находится компонент PageControl с двумя вкладками. На первой - набор элементов управления типа полей и кнопок, где нужно задать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.10.2015, 18:05
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru