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

C++

Войти
Регистрация
Восстановить пароль
 
 
mat_for_c
161 / 156 / 33
Регистрация: 26.04.2013
Сообщений: 701
Завершенные тесты: 2
#1

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

21.10.2015, 09:42. Просмотров 814. Ответов 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
Dmitriy_M
1356 / 1239 / 114
Регистрация: 20.03.2009
Сообщений: 4,438
Записей в блоге: 11
22.10.2015, 18:20 #16
Цитата Сообщение от quwy Посмотреть сообщение
volatile не дает компилятору так или иначе запихнуть переменную в контекст потока.
Дайте источник. Вы еще не учитываете, что у каждого ядра есть свой кеш, а volatile не гарантирует защиты от кеширования.

Цитата Сообщение от quwy Посмотреть сообщение
доступен не во всех компиляторах
Это в каких еще компиляторах нет атомарных переменных?
0
quwy
Native x86
3275 / 2121 / 573
Регистрация: 13.02.2013
Сообщений: 7,066
22.10.2015, 18:41 #17
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Дайте источник.
Источник чего?

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Вы еще не учитываете, что у каждого ядра есть свой кеш, а volatile не гарантирует защиты от кеширования.
Кеш всех ядер всегда содержит актуальные данные. В противном случае постоянно наблюдались бы проблемы несогласованности состояний. Поток в любой момент может быть перемещен с одного ядра на другое (и это в реальных системах происходит достаточно часто). Представляете, что было бы, если бы такой поток начал читать данные из кеша одного ядра, а после перемещения продолжил бы читать более старую или более новую версию этих данных из кеша другого ядра? Согласованность данных в кешах строго обязательна для нормального функционирования системы.

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Это в каких еще компиляторах нет атомарных переменных?
В компиляторах для контроллеров, например.
0
Dmitriy_M
1356 / 1239 / 114
Регистрация: 20.03.2009
Сообщений: 4,438
Записей в блоге: 11
22.10.2015, 19:02 #18
Цитата Сообщение от quwy Посмотреть сообщение
Источник чего?
Источник на который вы опираетесь. Алена в свое время так же указала, что использование volatile.
Цитата Сообщение от quwy Посмотреть сообщение
Кеш всех ядер всегда содержит актуальные данные.
Как же.
Цитата Сообщение от quwy Посмотреть сообщение
В противном случае постоянно наблюдались бы проблемы несогласованности состояний
А они и наблюдаются, если нет синхронизации.

Цитата Сообщение от quwy Посмотреть сообщение
В компиляторах для контроллеров, например.
Атомики как правило реализуются в виде библиотеки, и сделать свой класс атомиков для контроллера не так уж и сложно.
0
quwy
Native x86
3275 / 2121 / 573
Регистрация: 13.02.2013
Сообщений: 7,066
23.10.2015, 12:26 #19
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Источник на который вы опираетесь.
Документация по языку. Данное ключевое слово отбивает компилятору охоту оптимизировать доступ к переменной, и если написано if(a), то это всегда будет cmp [00ABCDEFh], 0 и je (или аналогичный по смыслу код), без перемещения переменной в регистр, вырезания проверок и т.п.

Что касается алениной информации о возможной неатомарности BOOL, то это, не имеет ни малейшего значения. Будь запись хоть сто раз не атомарной, все равно момент, когда переменная из "ноль" превращается в "не ноль", атомарен по определению.

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
А они и наблюдаются, если нет синхронизации.
О какой синхронизации речь? Я описал вам реальную ситуацию, когда даже однопотоковое приложение свалится, если кеши ядер не будут согласованы. Повторю еще раз: кеши ядер, которые кешируют пересекающиеся адреса, всегда согласованы, без этого система просто заглючит в первые же миллисекунды после запуска.

Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Атомики как правило реализуются в виде библиотеки, и сделать свой класс атомиков для контроллера не так уж и сложно.
Но не всегда это нужно.
0
Avazart
Нарушитель
Эксперт С++
7231 / 5403 / 291
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
27.10.2015, 18:34 #20
Цитата Сообщение от quwy Посмотреть сообщение
Я сразу сказал, что это не по канонам,
Это заведомо глупый совет, освежите знания!

См. Архитектура многопоточного приложения, Нужно ли синхронизировать доступ к переменной из двух потоков?

Кстати в boost есть interupt() для прерывания.
0
quwy
Native x86
3275 / 2121 / 573
Регистрация: 13.02.2013
Сообщений: 7,066
27.10.2015, 19:41 #21
Цитата Сообщение от Avazart Посмотреть сообщение
Это заведомо глупый совет, освежите знания!
До тех пор, пока мне не приведут реальный сценарий появления проблемы при попытке остановки потоков с использованием volatile bool, я остаюсь при своем.

Добавлено через 2 минуты
Первая ссылка лишь на ваше мнение, а во второй затрагивается вопрос модификации данных несколькими потоками, в то время как в данной теме все несколько иначе: рабочие потоки читают переменную, и только один управляющий поток -- пишет.
0
Убежденный
Системный программист
Эксперт С++
15683 / 7193 / 1136
Регистрация: 02.05.2013
Сообщений: 11,630
Записей в блоге: 1
Завершенные тесты: 1
27.10.2015, 21:04 #22
Цитата Сообщение от quwy
Только не забудьте объявить ее как volatile.
Цитата Сообщение от Dmitriy_M
То что вы говорите это хаки завязанные на реализацию bool, volatile в конкретных
компиляторах на конкретных архитектурах.
Если речь про Visual C++ и x86/x64, то там как раз есть такие гарантии, часть из них
дает компилятор (Microsoft Specific), часть аппаратура, в итоге иногда можно успешно
обходиться без atomic и ко. В данном конкретном случае (mat_for_c: каждый раз буду
опрашивать переменную, отвечающую за завершение потока) использование volatile корректно.

В худшем случае можно получить ситуацию, описанную quwy выше:

Цитата Сообщение от quwy
ожидающий сигнала поток провернет один лишний цикл вместо того, чтобы завершиться немедленно.
Т.е. из-за эффекта store buffers потоки, выполняющиеся на других процессорах,
могут увидеть новое значение volatile-переменной не сразу, а спустя какое-то
время (например, когда на исходном CPU возникнет прерывание).
2
Avazart
Нарушитель
Эксперт С++
7231 / 5403 / 291
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
27.10.2015, 21:08 #23
В данном конкретном случае нет смысла думать об архитектуре и гарантиях ибо и так уже используется С++11.
1
Убежденный
Системный программист
Эксперт С++
15683 / 7193 / 1136
Регистрация: 02.05.2013
Сообщений: 11,630
Записей в блоге: 1
Завершенные тесты: 1
27.10.2015, 21:13 #24
А в C++11 есть средства, по функциональности идентичные поведению volatile в VC++ ?
0
Avazart
Нарушитель
Эксперт С++
7231 / 5403 / 291
Регистрация: 10.12.2010
Сообщений: 23,945
Записей в блоге: 17
27.10.2015, 21:29 #25
std::atomic_flag ?
1
Убежденный
Системный программист
Эксперт С++
15683 / 7193 / 1136
Регистрация: 02.05.2013
Сообщений: 11,630
Записей в блоге: 1
Завершенные тесты: 1
27.10.2015, 21:54 #26
Вообще-то да, тут ты полностью прав, а я, что называется, заврался.
При условии правильного использования atomic и memory_order можно добиться в
точности того же поведения, как с volatile (при этом большой плюс к переносимости).
Здесь я имею в виду ситуацию, когда, например, нужно несколько раз писать в
переменную, но при этом не вызывать сброс кэшей до нужного момента: volatile в
паре с MemoryBarrier (в VC++) обеспечивает такое поведение по умолчанию, а
для atomic нужно в явном виде указывать флаги типа memory_order_relaxed и в
финале memory_order_seq_cst.
1
nmcf
5349 / 4669 / 1561
Регистрация: 14.04.2014
Сообщений: 18,595
27.10.2015, 22:55 #27
Дядьки серьёзные такие сложные вещи начали обсуждать, что я уже перестаю понимать.
А разве memory_order_relaxed к Intel процессорам применим? Там же вроде бы никакого relaxed и не бывает, процессор сам синхронизирует выполнение.
0
Убежденный
Системный программист
Эксперт С++
15683 / 7193 / 1136
Регистрация: 02.05.2013
Сообщений: 11,630
Записей в блоге: 1
Завершенные тесты: 1
28.10.2015, 09:57 #28
Цитата Сообщение от nmcf Посмотреть сообщение
А разве memory_order_relaxed к Intel процессорам применим?
Memory_order определяет семантику доступа к atomic в терминах модели памяти C++,
а не в терминах конкретных архитектур типа Intel, ARM и т.п. Т.е. если я пишу:
C++
1
AtomicVar.store(0x123, std::memory_model_relaxed);
то компилятор должен обеспечить для AtomicVar только атомарность записи 0x123 и все,
ни о возможном переупорядочивании, ни о других побочных эффектах ему заботиться не нужно
(я немного упрощаю, т.к. какие-то дополнительные требования к relaxed все же есть,
знатоки C++11 подскажут). При этом вполне возможно, что процессорная архитектура, на
которой выполняется данный код, вообще свободна от таких побочных эффектов.

Цитата Сообщение от nmcf Посмотреть сообщение
Там же вроде бы никакого relaxed и не бывает, процессор сам синхронизирует выполнение.
Это не совсем так.
На Intel (x86 и x64, про Itanium отдельная история) операции store-load могут выполняться
процессором в обратном порядке. Кроме того, запись в память одним процессором может
некоторое время быть не видна другим процессорам из-за store buffers.
1
28.10.2015, 09:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2015, 09:57
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

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