<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825876</guid>
        <pubDate>Tue, 17 Mar 2020 10:51:35 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825876</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825862'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2020-03-17T11:07:50+03:00">17.03.20, 08:07</time></span><div class='quote '>Затем, что если убрать обработку сетевого пакета тем же линухом, и обработать его самому, то время обработки сократиться до ~60 циклов CPU на пакет, вот и посчитай какие хайлоад системы по обработке сетевого трафика можно реализовать, сиськи с джуниперами нервно курят в сторонке. </div></div><br>
И все равно я не согласен. Не хочешь отдавать пакеты родному стеку - напиши свой загружаемый модуль и в нем обрабатывай. С точки зрения защищенности системы - это, правильнее ИМХО. <br>
<br>
ЗЫ: Хотя мы, походу, уходим куда-то в сторону от темы топика  :-?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825862</guid>
        <pubDate>Tue, 17 Mar 2020 08:07:50 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825862</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825855'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-17T04:31:05+00:00">17.03.20, 04:31</time></span><div class='quote '>Зачем создавать и отлаживать защищенные механизмы Оси, если вот такие дыры в ней проделывают?</div></div><br>
Затем, что если убрать обработку сетевого пакета тем же линухом, и обработать его самому, то время обработки сократиться до ~60 циклов CPU на пакет, вот и посчитай какие хайлоад системы по обработке сетевого трафика можно реализовать, сиськи с джуниперами нервно курят в сторонке.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825855</guid>
        <pubDate>Tue, 17 Mar 2020 04:31:05 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825855</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825853'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2020-03-17T03:56:00+00:00">17.03.20, 03:56</time></span><div class='quote '>Ну драйвер конечно нужен,</div></div><br>
Вот поэтому и говорим, что драйвер дает только API для управления &quot;железом&quot;. Хотя, я как-то встречал интересный драйвер уровня ядра для винды, что-то типа portio.sys (не помню точно). Цель создания этой дровины - дать доступ из режима пользователя к портам железа. Да, и драйвер был, и проги были, его использующие. Но это все равно &quot;хак&quot;, а не нормальное программирование. Зачем создавать и отлаживать защищенные механизмы Оси, если вот такие дыры в ней проделывают?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825853</guid>
        <pubDate>Tue, 17 Mar 2020 03:56:00 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825853</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825852'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-17T03:08:21+00:00">17.03.20, 03:08</time></span><div class='quote '>Но это вот не значит же, что это программа напрямую общается с аппаратурой сетевого контроллера?</div></div><br>
Ну драйвер конечно нужен, НО, только для инициализации железки и предоставление интерфейса. Затем делается анбинд сетевухи, чтобы ОСь не дёргалась на неё вообще. Я попробовал туда сунуться, хотел по минимуму сетевой стек нарисовать, хотя бы базовое типа arp/ip, обычная маршрутизация трафика, но не хватает мозгов, лазию читаю, облизываюсь.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825852</guid>
        <pubDate>Tue, 17 Mar 2020 03:08:21 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825852</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825851'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2020-03-16T23:07:27+00:00">16.03.20, 23:07</time></span><div class='quote '>Давно уже можно на стороне юзера обрабатывать теже сетевые пакеты минуя стек ОС полностью</div></div><br>
Но это вот не значит же, что это программа напрямую общается с аппаратурой сетевого контроллера? Если речь идет о сырых сокетах, так то через API операционных систем.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825851</guid>
        <pubDate>Mon, 16 Mar 2020 23:07:27 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825851</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825628'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-15T14:18:47+00:00">15.03.20, 14:18</time></span><div class='quote '>НО ОТ ЭТОГО АППАРАТУРА НА СТОРОНЕ ЮЗЕРА НЕ СТАЛА ОБРАБАТЫВАТЬСЯ&#33;</div></div><br>
Давно уже можно на стороне юзера обрабатывать теже сетевые пакеты минуя стек ОС полностью  ;)]]></description>
        <author>Gonarh</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825833</guid>
        <pubDate>Mon, 16 Mar 2020 17:40:14 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825833</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825628'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-15T14:18:47+00:00">15.03.20, 14:18</time></span><div class='quote '>Когда нормальные пацанчики разделяют &quot;kernel-mode&quot; и &quot;usеr-mode&quot;, то они лепят еще один слой, и получается &quot;kernel-mode&quot;<br>
, &quot;service-mode&quot; и &quot;usеr-mode&quot;.</div></div><br>
Бывают и всего с 2 слоями.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825628'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-15T14:18:47+00:00">15.03.20, 14:18</time></span><div class='quote '>Ну давайте не будем кривить душой - откусили часть функционала ядра, обособили, снабдили большим чем юзер-спейс и меньшим чем кернель-спейс (возможно планировщик ядра повесили сверху). Ну да, может стало отзывчивее ... НО ОТ ЭТОГО АППАРАТУРА НА СТОРОНЕ ЮЗЕРА НЕ СТАЛА ОБРАБАТЫВАТЬСЯ&#33; В загружаемых модулях, в &quot;забытых детях ядра&quot;</div></div><br>
Микроядерные ОС не отзывчивее монолитных. Там фишка в другом - они (в теории) стабильнее и безопаснее. И да, в некоторый микроядерных ОС прерывания обрабатываются в user-space.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825628</guid>
        <pubDate>Sun, 15 Mar 2020 14:18:47 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825628</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825620'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-15T12:47:33+00:00">15.03.20, 12:47</time></span><div class='quote '>Разработчики микроядерных ОС с тобой несогласны.</div></div><br>
Просто они хотрованы&#33; Когда нормальные пацанчики разделяют &quot;kernel-mode&quot; и &quot;usеr-mode&quot;, то они лепят еще один слой, и получается &quot;kernel-mode&quot;<br>
, &quot;service-mode&quot; и &quot;usеr-mode&quot;. И в &quot;service-mode&quot; типа работает весь фарш. Ну давайте не будем кривить душой - откусили часть функционала ядра, обособили, снабдили большим чем юзер-спейс и меньшим чем кернель-спейс (возможно планировщик ядра повесили сверху). Ну да, может стало отзывчивее ... НО ОТ ЭТОГО АППАРАТУРА НА СТОРОНЕ ЮЗЕРА НЕ СТАЛА ОБРАБАТЫВАТЬСЯ&#33; В загружаемых модулях, в &quot;забытых детях ядра&quot;  :lol:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825620</guid>
        <pubDate>Sun, 15 Mar 2020 12:47:33 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825620</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825429'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:34:45+00:00">12.03.20, 16:34</time></span><div class='quote '>из<br>
общеупотребимых - &quot;кооперативная&quot; и &quot;вытесняющая&quot;. В первом случае (а это<br>
ранние версии Венды - поток сам решает, что и когда ему &quot;отдавать&quot;. Во<br>
втором - ядро решает:</div></div><br>
Почти во всех современных ОС многозадачность гибридная, т.е. обычно потоки отдают управление самостоятельно, но ОС может забрать управление по таймеру, если поток превысил допустимый квант времени.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825429'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:34:45+00:00">12.03.20, 16:34</time></span><div class='quote '>??? Это где и когда поток управлял своим выполнением ???</div></div><br>
Любые блокирующие функции к этому приводят. Доказать могу легко: делаешь Sleep(N) - в это время загрузка потока будет 0, аналогично чтение файла и пр... Поток может добровольно отдать управление, гарантированно получить управление он не может.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825429'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:34:45+00:00">12.03.20, 16:34</time></span><div class='quote '>А системный планировщик потоков был всегда &quot;свадебным генералом&quot;???</div></div><br>
Я не понимаю о чем ты.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825429'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:34:45+00:00">12.03.20, 16:34</time></span><div class='quote '>Кто-то из нас не имеет должных знаний, или не имеет тупо чуйки.<br>
Допускаю, что я. А ты? </div></div><br>
У меня есть свое игрушечное мини-ядро ОС с поддержкой SMP. Это так, для общей информации. Об ядрах *nix и Win тоже знаю представление и рекомендую посмотреть исходники ReactOS. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-15T12:51:54+00:00">15.03.20, 12:51</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825431'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T17:10:39+00:00">12.03.20, 17:10</time></span><div class='quote '>Не в курсе, не знаю, но я бы вынес этот обработчик в kernel-space. А уж из него в usеr-program слал результаты (а лучше - ивенты).</div></div><br>
kernel-space &#33;= уровень приоритета<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825431'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T17:10:39+00:00">12.03.20, 17:10</time></span><div class='quote '>Я-я ... гер майор - вся &quot;аппаратура должна оседать в кернель моде&quot;. Это - справедливо&#33; </div></div><br>
Разработчики микроядерных ОС с тобой несогласны.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825475</guid>
        <pubDate>Fri, 13 Mar 2020 10:50:15 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825475</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825422'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T15:47:11+00:00">12.03.20, 15:47</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825421'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T15:40:30+00:00">12.03.20, 15:40</time></span><div class='quote '>И что тебе это даст?</div></div><br>
Временное примирение с Килей&#33;  :lol:</div></div><br>
Знаешь, чтобы решать такие задачи, надо приобретать<br>
базовые знания. На лекциях в ВУЗ-е, читая книги,<br>
разыскивая статьи и доки - самостоятельно.<br>
---<br>
Конференция - это как курилка. Где можно услышать<br>
интересную мысль, узнать перспективный программный приём.<br>
А можно и не услышать и не узнать.<br>
Образования так не получишь.<br>
---<br>
Книга - друг инженера.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825431</guid>
        <pubDate>Thu, 12 Mar 2020 17:10:39 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825431</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825430'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:58:54+00:00">12.03.20, 16:58</time></span><div class='quote '>oeUser, на венде всё просто: любой пользовательский код работает на уровне приоритета ниже, чем у ... э-эм, &quot;синхропроцесса&quot;</div></div><br>
Вангую, даже нет&#33;&#33;&#33; Вещяю аки Соловьёв на TV - не только в венде, везде так. Иначе был бы аут и песец.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825430'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:58:54+00:00">12.03.20, 16:58</time></span><div class='quote '>все прерывания работают на уровнях выше &quot;программного&quot;</div></div><br>
Не в курсе, не знаю, но я бы вынес этот обработчик в kernel-space. А уж из него в usеr-program слал результаты (а лучше - ивенты).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825430'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:58:54+00:00">12.03.20, 16:58</time></span><div class='quote '>Важный вывод: объекты синхронизации не могут использоваться обработчиками прерываний</div></div><br>
Я-я ... гер майор - вся &quot;аппаратура должна оседать в кернель моде&quot;. Это - справедливо&#33;]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825430</guid>
        <pubDate>Thu, 12 Mar 2020 16:58:54 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825430</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>JoeUser</strong>, на венде всё просто: любой пользовательский код работает на уровне приоритета ниже, чем у ... э-эм, &quot;синхропроцесса&quot;, что и позволяет последнему указывать шедулеру, какой из потоков должен спать на объекте, а кто работать; синхропроцесс работает на максимальном &quot;программном&quot; уровне приоритета; все прерывания работают на уровнях выше &quot;программного&quot;. Очень грубо, но даёт представление о взаимодействии приоритетов, объектов синхронизации и шедулера. Важный вывод: объекты синхронизации не могут использоваться обработчиками прерываний, т.к. у них приоритеты выше, чем те, которыми способен управлять &quot;синхропроцесс&quot;. Так что как ни старайся, в лучшем случае WaitForXXXX() просто вернёт управление назад безусловно и безотносительно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825429</guid>
        <pubDate>Thu, 12 Mar 2020 16:34:45 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825429</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>shm</strong>, на все вопросы отвечать не буду, хлопотно это цитировать вики :)<br>
<br>
Но замечу ...  давай определимся о какой &quot;многозадачности мы говорим? из<br>
общеупотребимых - &quot;кооперативная&quot; и &quot;вытесняющая&quot;. В первом случае (а это<br>
ранние версии Венды - поток сам решает, что и когда ему &quot;отдавать&quot;. Во <br>
втором - ядро решает:<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>В реализации вытесняющая многозадачность отличается от кооперативной, в частности, тем, что требует обработки системного прерывания от аппаратного таймера. По истечении кванта времени, отведённого процессу, происходит прерывание и вызывается планировщик процессов. Частота вызова планировщика критична: слишком частый его вызов будет расходовать процессорное время впустую.</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825423'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T16:03:37+00:00">12.03.20, 16:03</time></span><div class='quote '>поток добровольно отдает управление</div></div><br>
??? Это где и когда поток управлял своим выполнением ??? А системный планировщик потоков был всегда &quot;свадебным генералом&quot;???<br>
<br>
<strong class='tag-b'>Резюме</strong><br>
<br>
Кто-то из нас не имеет должных знаний, или не имеет тупо чуйки. <br>
Допускаю, что я. А ты?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825423</guid>
        <pubDate>Thu, 12 Mar 2020 16:03:37 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825423</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825422'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T15:47:11+00:00">12.03.20, 15:47</time></span><div class='quote '>Ну &quot;захватил ты ресурс&quot; (начал обрабатывать прерываание) , а если системный планировщик потоков вдруг задумает тебя задинамить на 10 сек? Владелец ты, или нет ... будешь висеть 10 сек на ожидании</div></div><br>
Каким образом он это сделает, если обработчик еще не отослал EOI? :popcorn: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-12T16:05:54+00:00">12.03.20, 16:05</time></span></span><br>
Если мысль не понятна, то поясню. Текущий поток, который исполняется на ядре может переключиться только 2 сценариями:<br>
1. поток добровольно отдает управление: по сути это все блокирующие функции.<br>
2. происходит аппаратное прерывание и ОС принудительно делает переключение.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825422</guid>
        <pubDate>Thu, 12 Mar 2020 15:47:11 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825422</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825421'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T15:40:30+00:00">12.03.20, 15:40</time></span><div class='quote '>И что тебе это даст?</div></div><br>
Временное примирение с Килей&#33;  :lol: <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-12T15:53:54+00:00">12.03.20, 15:53</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825421'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-12T15:40:30+00:00">12.03.20, 15:40</time></span><div class='quote '>Дело не сколько в доступе к планировщику, а в обработке аппаратных прерываний.</div></div><br>
А я не согласен&#33;<br>
Ну &quot;захватил ты ресурс&quot; (начал обрабатывать прерываание) ,  а если системный планировщик потоков вдруг задумает тебя задинамить на 10 сек? Владелец ты, или нет ... будешь висеть 10 сек на ожидании.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825421</guid>
        <pubDate>Thu, 12 Mar 2020 15:40:30 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825421</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825357'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T15:38:28+00:00">11.03.20, 15:38</time></span><div class='quote '>но пока нет доступа к ядерному планировщику потоков - это будет, имхо, только имитация</div></div><br>
Дело не сколько в доступе к планировщику, а в обработке аппаратных прерываний. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-12T15:42:37+00:00">12.03.20, 15:42</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825357'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T15:38:28+00:00">11.03.20, 15:38</time></span><div class='quote '>Хотя в моем случае - ожидание завершения потока, в принципе, можно зацепить на мьютекс.</div></div><br>
И что тебе это даст?]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825369</guid>
        <pubDate>Wed, 11 Mar 2020 22:01:28 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825369</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825367'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T20:43:11+00:00">11.03.20, 20:43</time></span><div class='quote '>Имеется select, poll,epoll.</div></div><br>
Не &quot;локальные&quot; решения, а указанные мною либы претендуют на кроссплатформенные. К примеру:<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Currently, <strong class='tag-b'><span class="tag-color tag-color-named" data-value="red" style="color: red">libevent</span></strong> supports /dev/poll, kqueue(2), event ports, POSIX select(2), Windows select(), poll(2), and epoll(4). The internal event mechanism is completely independent of the exposed event API, and a simple update of libevent can provide new functionality without having to redesign the applications. As a result, Libevent allows for portable application development and provides the most scalable event notification mechanism available on an operating system. Libevent can also be used for multi-threaded applications, either by isolating each event_base so that only a single thread accesses it, or by locked access to a single shared event_base. Libevent should compile on Linux, *BSD, Mac OS X, Solaris, Windows, and more.</div></div>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825367</guid>
        <pubDate>Wed, 11 Mar 2020 20:43:11 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825367</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825272'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T02:42:53+00:00">11.03.20, 02:42</time></span><div class='quote '>.. И в *nix подобного очень не хватает, всякие там libevent + inotify + fsnotify запиливают,</div></div><br>
Имеется select, poll,epoll.<br>
Выбирай по вкусу.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825358</guid>
        <pubDate>Wed, 11 Mar 2020 15:54:32 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825358</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825353'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T12:40:45+00:00">11.03.20, 12:40</time></span><div class='quote '>Я бы не был так категоричен.</div></div><br>
То, что ты предлагаешь, в некоторых ЯП есть - это <a class='tag-url' href='https://ru.wikipedia.org/wiki/Green_threads' target='_blank'>зеленые потоки</a>. Но реализовать без языковой VM - это, по-сути, писать часть своей VM. Если бы комитет за это взялся - я бы просто офигел. Надеюсь С++ не скатится в недо си-шарпо-джавы.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825357</guid>
        <pubDate>Wed, 11 Mar 2020 15:38:28 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825357</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825353'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T12:40:45+00:00">11.03.20, 12:40</time></span><div class='quote '>что вне ядра подсистемы синхронизации, типа как в винды, невозможно</div></div><br>
Ключевые слова: &quot;вне ядра невозможно&quot;.  Можно написать кучу велосипедов, но пока нет доступа к ядерному планировщику потоков - это будет, имхо, только имитация. И да, в Линухах, *BSD-системах ядро открытое, там в принципе попытаться можно. Как? Я не в теме. Но думаю одним лишь загружаемым модулем не обойтись, как догадка.<br>
<br>
<strong class='tag-b'>shm</strong>, ты все правильно написал. Я так и реализовал, и других альтернатив не вижу. Хотя в моем случае - ожидание завершения потока, в принципе, можно зацепить на мьютекс. Но это ну совсем не критично в моем варианте. У меня это скорее дань к подходу к работе с внешними процессами, т.к. у меня выход из цикла - это по сути пару машиннх команд до завершения фонового потока.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825354'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T13:09:29+00:00">11.03.20, 13:09</time></span><div class='quote '>Более сложное - использовать события ОС об изменения файла/каталога в асинхронном варианте.</div></div><br>
Да, я бегло читал про возможности часто-используемых ОС-ей. В венде и линухах можно, во фряхе ... еще мутят (инфа от 2014 года), может уже и намутили.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825354</guid>
        <pubDate>Wed, 11 Mar 2020 13:09:29 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825354</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825241'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T15:45:15+00:00">10.03.20, 15:45</time></span><div class='quote '>Так вот первую функцию я не могу использовать по одной простой причине - пока она бесконечно висит я не могу завершить поток нормальным способом если вдруг мне это надо. Поэтому я использую вторую функцию с указанием тайм аута. Нет данных - пошла очередная итерация цикла. А вот в ней я уже могу анализировать BreakFlag. Если увижу что взведен - выхожу из цикла и завершаю поток.<br>
</div></div><br>
Раз у тебя нет в арсенале неблокирующих функций, то никакие cv тебе не помогут. Читай с небольшим таймаутом и в каждой итерации проверяй флаг выхода, лучше особо ничего не сделаешь. Из очевидных минусов: необходимость доп. потока и завершение будет с задержкой (обычно это не критично).<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825241'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T15:45:15+00:00">10.03.20, 15:45</time></span><div class='quote '>Я должен осуществлять другую операцию в потоке - вместо interception_wait_with_timeout ... что нибудь типа std::filesystem::exists(&quot;helloworld.txt&quot;). И если файл найден - удалять. Делать пока поток не будет прерван. Если sleep в цикл не поставлю - &quot;комп через час-два закипит&quot;? </div></div><br>
Простое решение - проверять со sleep&#39;ом в цикле. Более сложное - использовать события ОС об изменения файла/каталога в асинхронном варианте. В Виндах это, например, ReadDirectoryChangesW.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825353</guid>
        <pubDate>Wed, 11 Mar 2020 12:40:45 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825353</link>
        <description><![CDATA[Qraizer: Смысл yield-а в том, чтобы, имея постоянную полезную работу, время от времени проталкивать фоновые процессы, если они есть. Если у тебя нет полезной работы, а пуллинг – это не полезная работа, это её ожидание, – yield не подходит идеологически.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825273'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-11T03:16:56+00:00">11.03.20, 03:16</time></span><div class='quote '>Этого и не будет никогда.</div></div>Я бы не был так категоричен. Его можно создать на имеющихся примитивах, притом что архитектурно его спроектировать не так-то просто, поэтому и нет пока, ибо комитет просто не хочет садиться в лужу очередной раз, как это уже случалось из-за непродуманной архитектуры библиотечной фичи. Реализовать полный аналог WaitForMultipleObjects() сложно, и ещё сложнее сделать этот механизм удобным и универсальным. Но конкретно ты конкретно в твоём приложении легко это сделаешь в частном порядке, не затратив существенных усилий.<br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-11T12:46:38+00:00">11.03.20, 12:46</time></span></span><br>
Например. Если ожидать &quot;любого из&quot; объектов, то их надо опрашивать одновременно и тут же, как только, захватывать освободившийся. И всё это атомарно. Последнее условие непросто соблюсти, нельзя их опрашивать тупо по очереди, и захватывать первый попавшийся, будет race condition из-за того, что другой поток может быть позади тебя на пару объектов, и у него другой их набор, да ещё и на другом условии их комбинирования. Если нужно ждать &quot;всех сразу&quot;, то последовательно тоже нельзя опрашивать и захватывать, будет dead lock по тем же причинам. Обеспечить атомарность можно, только имея контроль над сущностями, а не их представлениями, что вне ядра подсистемы синхронизации, типа как в винды, невозможно, т.к. изначально объекты синхронизации друг с другом никакими условиями не связаны и разными нитками запросто могут использоваться в разных комбинациях и даже поодиночке.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825273</guid>
        <pubDate>Wed, 11 Mar 2020 03:16:56 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825273</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T22:23:37+00:00">10.03.20, 22:23</time></span><div class='quote '> Я бы хотел подобного в std</div></div><br>
Этого и не будет никогда. По крайней мере если коренным образом не определят, что для обеспечения многозадачности С++ - операционная система должна обеспечивать событийную модель взаимодействия. ИМХО, нереально такое ждать.<br>
<br>
Смысл же WaitForSingleObject/WaitForMultipleObjects в чем? Ядро ОС приостанавливает поток до наступления &quot;одного/одного из&quot; событий (ну или если указано не бесконечное время ожидания) и не отдает ему управление (не ставит в очередь на получение квантов времени).  Что мы имеем с std::this_thread::sleep_for? Ядро ОС усыпляет безусловно поток (не ставит в очередь на получение квантов времени) на единицу времени. А что имеем с std::this_thread::yield? Поток вычисления ядром ОС перебрасывается в конец очереди ожидания за получением своего кванта вычислений. <br>
<br>
И именно ядро усыпляет и пробуждает потоки. И С++ тут никак на этот механизм не может повлиять.<br>
<br>
Плюс ко всему в последних двух случаях (моей проги) периодически дергается проверка атомарного флага или мьютекса. И если поток не уcыплять - вот тут и ненужные вычисления , ну и бессмысленная загрузка CPU.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825272</guid>
        <pubDate>Wed, 11 Mar 2020 02:42:53 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825272</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T22:23:37+00:00">10.03.20, 22:23</time></span><div class='quote '>Они тут по факту не нужны. Но если очень хочется, то можно.</div></div><br>
В том то и дело, что <strong class='tag-b'>Gonarh</strong> тут правильно упомянул Бритву Оккамы - если профита в данном случае нет, значит нафик и не нужно.<br>
 <br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T22:23:37+00:00">10.03.20, 22:23</time></span><div class='quote '>На WinAPI множественные события ждутся элементарным WaitForMultipleObjects, которая тебе сразу и вернёт тот объект, который отнотифил. Очень удобно. Я бы хотел подобного в std</div></div><br>
Да я в курсе. И в *nix подобного очень не хватает, всякие там libevent + inotify + fsnotify запиливают, чтобы можно было реально засыпать на INFINITY время, но мочь всеж проснуться, а не дергать отдельные флаги или мьютексы.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825269'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Qraizer &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T22:23:37+00:00">10.03.20, 22:23</time></span><div class='quote '>Конкретно в твоём примере на cv имеет смысл завести лишь BreakEvent. Маловато, проще явно опрашивать. </div></div><br>
Да нет - не &quot;имеет смысл&quot;, а &quot;можно сделать&quot;. Но лучше не делать, ибо сам ответил - &quot;проще опрашивать&quot;.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825269</guid>
        <pubDate>Tue, 10 Mar 2020 22:23:37 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825269</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:41:47+00:00">10.03.20, 16:41</time></span><div class='quote '>Перепишите мне с мьютексами, семафорами, или condition_variable чтобы стало лучше/правильнее. И что именно станет правильнее и лучше?</div></div>Они тут по факту не нужны. Но если очень хочется, то можно. Очень хочется – это если хочешь один раз написать и не париться. На WinAPI множественные события ждутся элементарным WaitForMultipleObjects, которая тебе сразу и вернёт тот объект, который отнотифил. Очень удобно. Я бы хотел подобного в std, но коли его нет, можно написать самому: собираешь контейнер предикатов и ожидаешь по нужной комбинации условий, пока не сработают; выходишь с возвратом кортежа результатов предикатов, вызывающий пусть сам анализирует.<br>
Конкретно в твоём примере на cv имеет смысл завести лишь BreakEvent. Маловато, проще явно опрашивать.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825264</guid>
        <pubDate>Tue, 10 Mar 2020 19:36:55 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825264</link>
        <description><![CDATA[Gonarh: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>А вот теперь мне в своей проге понадобилось сделать что-то подобное.</div></div><br>
У мну жсм-шлюз читает/пишет смс-ки в/на ком-порт, достаточно <s class='tag-s'>одной таблэтки</s> обычного слипа. нехер мудрствовать, бритва оккама в помощь.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825259</guid>
        <pubDate>Tue, 10 Mar 2020 18:17:59 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825259</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825254'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:47:58+00:00">10.03.20, 17:47</time></span><div class='quote '>Вот тут:<br>
CollapsedWrap disabledLine numbers off<br>
<br>
    if (std::filesystem::exists(FileName))</div></div><br>
Если тебе нужно конкретно файл мониторить, то в принципе тебе выше написали решение:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;filesystem&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;atomic&#62;</div><div class="code_line">#include &#60;condition_variable&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std::chrono_literals;</div><div class="code_line">&nbsp;</div><div class="code_line">std::atomic&#60;bool&#62; BreakFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">std::atomic&#60;bool&#62; TerminateFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">std::string FileName = &quot;C://Temp//helloworld.txt&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">std::condition_variable cv;</div><div class="code_line">std::mutex cv_m;</div><div class="code_line">&nbsp;</div><div class="code_line">void ThreadFunc() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (BreakFlag) break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::unique_lock&#60;std::mutex&#62; lk(cv_m);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (cv.wait_for(lk, std::chrono::seconds(1), [=]() {return std::filesystem::exists(FileName); }))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::filesystem::remove(FileName);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cv.notify_one();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;catch (...) {}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// std::this_thread::sleep_for(1ms); // Если не раскоментировать - будет жесть, 17-20% жрет CPU!!!</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (true);</div><div class="code_line">&nbsp;&nbsp; &nbsp;TerminateFlag = true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string str;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::thread Thread(ThreadFunc);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Thread.detach();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Type \&quot;Exit\&quot; to exit...&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cin &#62;&#62; str;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (str != &quot;Exit&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;BreakFlag = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (!TerminateFlag) std::this_thread::yield();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Done.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Но это тупо. Потому как у тебя нечего оповещать. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T18:19:09+00:00">10.03.20, 18:19</time></span></span><br>
Если тебе нужно конкретно это условие мониторить, то ты можешь написать класс на основе шаблона Observer, и не выносить мозг себе и людям. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T18:20:15+00:00">10.03.20, 18:20</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825258'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T18:11:44+00:00">10.03.20, 18:11</time></span><div class='quote '>Киля, спасибо за беседу&#33; </div></div><br>
Ааа, я понял. Ну и иди в баню. <span class="tag-color tag-color-named" data-value="red" style="color: red">censored</span> Пишешь одно, имея ввиду другое, потом еще фыркаешь. Я это запомню. Давай досвидания.]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825258</guid>
        <pubDate>Tue, 10 Mar 2020 18:11:44 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825258</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825253'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:47:24+00:00">10.03.20, 17:47</time></span><div class='quote '>Ты не можешь подписаться в системе на такое событие - &quot;наличие такого-то файла&quot;.</div></div><br>
В винде точно есть, но не помню и искать лень. Для FreeBSD вроде запилили <a class='tag-url' href='https://www.freshports.org/devel/libinotify' target='_blank'>libinotify</a>. Про OSX не в курсе. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T18:13:38+00:00">10.03.20, 18:13</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825257'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T18:09:04+00:00">10.03.20, 18:09</time></span><div class='quote '>И как это условие связано с твоими флагами?</div></div><br>
Киля, спасибо за беседу&#33; ;)]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825257</guid>
        <pubDate>Tue, 10 Mar 2020 18:09:04 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825257</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825252'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:46:58+00:00">10.03.20, 17:46</time></span><div class='quote '>Если слип-задержку не раскоментить - как жрала прога 17% CPU, так и жрет. Это сразу было видно по твоему коду. Но я проверил на всяк случай:</div></div><br>
Потому что у тебя в цикле нет мониторинга чего либо, у тебя там выполняются конкретные действия, а не &quot;мониторит состояние фискального аппарата&quot;. Вот ежели бы тебе нужно было мониторить папку на наличие в ней например какого то файла(появился - что то сделать), а до этого момента просто тупо цикл с проверкой - вот тогда это был бы мониторинг.<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825254'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:47:58+00:00">10.03.20, 17:47</time></span><div class='quote '>Вот тут:<br>
CollapsedWrap disabledLine numbers off<br>
<br>
    if (std::filesystem::exists(FileName))</div></div><br>
 :facepalm:  И как это условие связано с твоими флагами?  :unsure:]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825256</guid>
        <pubDate>Tue, 10 Mar 2020 18:03:46 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825256</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825253'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:47:24+00:00">10.03.20, 17:47</time></span><div class='quote '>Ты не можешь подписаться в системе на такое событие - &quot;наличие такого-то файла&quot;.</div></div><br>
Ну в разных ОС по разному, в Линухе, к примеру, это можно решить с помощью <a class='tag-url' href='https://developer.ibm.com/tutorials/l-inotify/' target='_blank'>inotify</a>. <br>
Там много чего можно отслеживать, в том числе и появление файла, и его закрытие после записи.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825254</guid>
        <pubDate>Tue, 10 Mar 2020 17:47:58 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825254</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825251'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:45:50+00:00">10.03.20, 17:45</time></span><div class='quote '>Где в твоем примере мониторинг состояния, любого?</div></div><br>
Вот тут:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if (std::filesystem::exists(FileName))</div></ol></div></div></div></div>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825253</guid>
        <pubDate>Tue, 10 Mar 2020 17:47:24 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825253</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:41:47+00:00">10.03.20, 16:41</time></span><div class='quote '>А именно ищет файл &quot;C://Temp//helloworld.txt&quot; и если находит - грохает его. <br>
<br>
Перепишите мне с мьютексами, семафорами, или condition_variable чтобы стало лучше/правильнее. И что именно станет правильнее и лучше?</div></div><br>
Эта задача правильнее и лучше не решается.<br>
Ты не можешь подписаться в системе на такое событие - &quot;наличие такого-то файла&quot;.<br>
А вот следить за изменениями в указанной директории вроде можно.<br>
(я этого не делал, поэтому определённо сказать не могу).<br>
<a class='tag-url' href='https://docs.microsoft.com/ru-ru/windows/win32/fileio/obtaining-directory-change-notifications?redirectedfrom=MSDN' target='_blank'>тут</a><br>
Поэтому заснуть потоком, но ждать событие &quot;изменения в папке&quot; - можно.<br>
---<br>
И потом - что значит &quot;правильнее и лучше&quot; ?<br>
Это всё субъективно.<br>
Для того, что ты показал, сделанное достаточно.<br>
Но если бы ты задавал имя файла для поиска и уничтожения<br>
в окошке эдита, а потом жал на кнопку, тогда надо:<br>
1. Заснуть потоком на Wait.<br>
2. Ждём 2 события - Exit и Work.<br>
3. Если завершаем приложение, взводим Exit<br>
4. Если жмём на кнопку &quot;Уничтожить указанный файл&quot; - значит<br>
взводим Work. Дальше начинается поиск файла в папке и всех вложенных папках<br>
и уничтожение его. Потом снова засыпаем.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825252</guid>
        <pubDate>Tue, 10 Mar 2020 17:46:58 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825252</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825249'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:23:54+00:00">10.03.20, 17:23</time></span><div class='quote '>Тогда как то так будет:</div></div><br>
И улучшений - нуль&#33;  :lol: <br>
Если слип-задержку не раскоментить - как жрала прога 17% CPU, так и жрет. Это сразу было видно по твоему коду. Но я проверил на всяк случай:<br>
<br>
<img class='tag-img' src='https://i111.fastpic.ru/big/2020/0310/27/6dd8ba1c567ee0a752f56d02b0a64427.png' alt='user posted image'>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825251</guid>
        <pubDate>Tue, 10 Mar 2020 17:45:50 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825251</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825250'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:39:14+00:00">10.03.20, 17:39</time></span><div class='quote '>Да ё-мое&#33; Ну почитай ты название топика&#33; :( Я спрашивал что нужно чтобы прога не жрала CPU без надобности и только. А то что я усыпляю его на доли секунды - это как одно из решений. Я не спрашиваю как его полностью усыпить&#33; </div></div><br>
В каком месте у тебя прога жрет CPU без надобности? <br>
Ты в первом посту пишешь:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>В одной из программ, которую подогнали разработчики, постоянная загрузка CPU висит в районе 25%. И это на Core i3 2.5GHz. <strong class='tag-b'>А программа всего лишь что и делает в фоне - только мониторит состояние фискального аппарата</strong> (если я не ошибаюсь по COM-порту). Все мои попытки убедить разработчиков, что это нонсенс, упираются в &quot;стену&quot;. Отвечают что-то в роде &quot;нам важно, чтобы система с фискальным аппаратом работала без задержек, мы лучше знаем&quot; :wall: Я подозреваю, что залепили в своем коде что-то в виде:</div></div><br>
Где в твоем примере мониторинг состояния, любого?]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825250</guid>
        <pubDate>Tue, 10 Mar 2020 17:39:14 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825250</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825249'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:23:54+00:00">10.03.20, 17:23</time></span><div class='quote '>Ты пишешь - как мне усыпить поток</div></div><br>
Да ё-мое&#33; Ну почитай ты название топика&#33; :( Я спрашивал  что нужно чтобы прога не жрала CPU без надобности и только. А то что я усыпляю его на доли секунды - это как одно из решений. Я не спрашиваю как его полностью усыпить&#33; <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T17:41:47+00:00">10.03.20, 17:41</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825249'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T17:23:54+00:00">10.03.20, 17:23</time></span><div class='quote '>Я не понимаю твоего примера.</div></div><br>
Я старался&#33;  :no-sad:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825249</guid>
        <pubDate>Tue, 10 Mar 2020 17:23:54 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825249</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825246'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:41:47+00:00">10.03.20, 16:41</time></span><div class='quote '>Прога элементарная. Ждет написания в консоли слова Exit и нажатие [Enter]. А пока ждет - работает. А именно ищет файл &quot;C://Temp//helloworld.txt&quot; и если находит - грохает его.<br>
<br>
Перепишите мне с мьютексами, семафорами, или condition_variable чтобы стало лучше/правильнее. И что именно станет правильнее и лучше?<br>
</div></div><br>
А причем тут эта прога и то что ты хочешь? Ты пишешь - как мне усыпить поток, чтоб он мне CPU не жрал. И просишь переписать твой пример - где у тебя усыплением потока и не пахнет, где один поток файлы ищет, а второй ждет пока ему Exit не напишут. Как ты свой пример перепишешь с WaitForMultiplyObjects ? Я не понимаю твоего примера. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T17:33:54+00:00">10.03.20, 17:33</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825248'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:44:26+00:00">10.03.20, 16:44</time></span><div class='quote '>Мой перепиши, плс, то что мне надо. </div></div><br>
Не могу. У тебя приведенный пример, противоречит тому, что ты тут две страницы пояснял. Я не знаю что тебе тут переписать? В примере приведеном тобою главный поток ждет, пока ему не напишут Exit, а потом тупо выходит.<br>
Или тебе нужно застопорить поток там, где у тебя std::this_thread::yield(); ?<br>
Тогда как то так будет:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;filesystem&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;atomic&#62;</div><div class="code_line">#include &#60;condition_variable&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std::chrono_literals;</div><div class="code_line">&nbsp;</div><div class="code_line">bool BreakFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">bool TerminateFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">std::string FileName = &quot;C://Temp//helloworld.txt&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">std::condition_variable cv;</div><div class="code_line">std::mutex cv_m;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">void ThreadFunc() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (BreakFlag)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cv.notify_one();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (std::filesystem::exists(FileName))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;std::filesystem::remove(FileName);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;catch (...) {}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;// std::this_thread::sleep_for(1ms); // Если не раскоментировать - будет жесть, 17-20% жрет CPU!!!</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (true);</div><div class="code_line">&nbsp;&nbsp; &nbsp;TerminateFlag = true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::string str;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::thread Thread(ThreadFunc);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Thread.detach();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Type \&quot;Exit\&quot; to exit...&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cin &#62;&#62; str;</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (str != &quot;Exit&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;BreakFlag = true;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (true)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::unique_lock&#60;std::mutex&#62; lk(cv_m);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (cv.wait_for(lk, std::chrono::seconds(1), [=]() {return TerminateFlag; }))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Done.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825248</guid>
        <pubDate>Tue, 10 Mar 2020 16:44:26 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825248</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825244'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:37:33+00:00">10.03.20, 16:37</time></span><div class='quote '>На сколько я понял у тебя это как раз взаимосвязано. Там где тебе нужно поменять флаг - там ты пишешь notify_one/notify_all, там где у тебя флаги проверяются - ты пишешь wait/wait_for/wait_until/etc.</div></div><br>
Киля, вон я выше накидал тестовую прогу. К тебе тож просьба - перепиши ее с твоими wait/async/future, ну как ты советовал. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T16:45:28+00:00">10.03.20, 16:45</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825247'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T16:42:10+00:00">10.03.20, 16:42</time></span><div class='quote '>Вот например есть какой то синтетический пример</div></div><br>
Мой перепиши, плс, то что мне надо.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825247</guid>
        <pubDate>Tue, 10 Mar 2020 16:42:10 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825247</link>
        <description><![CDATA[Wound: Вот например есть какой то синтетический пример, показывающий как это все работает: <a class='tag-url' href='https://ru.cppreference.com/w/cpp/thread/condition_variable/wait_for' target='_blank'>https://ru.cppreference.com/w/cpp/thread/co...riable/wait_for</a><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;atomic&#62;</div><div class="code_line">#include &#60;condition_variable&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">std::condition_variable cv;</div><div class="code_line">std::mutex cv_m;</div><div class="code_line">std::atomic&#60;int&#62; i = ATOMIC_VAR_INIT(0);</div><div class="code_line">&nbsp;</div><div class="code_line">void waits(int idx)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::unique_lock&#60;std::mutex&#62; lk(cv_m);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(cv.wait_for(lk, std::chrono::milliseconds(idx*100), [](){return i == 1;}))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;Thread &quot; &#60;&#60; idx &#60;&#60; &quot; finished waiting. i == &quot; &#60;&#60; i &#60;&#60; &#39;\n&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;std::cerr &#60;&#60; &quot;Thread &quot; &#60;&#60; idx &#60;&#60; &quot; timed out. i == &quot; &#60;&#60; i &#60;&#60; &#39;\n&#39;;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">void signals()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(120));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cerr &#60;&#60; &quot;Notifying...\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv.notify_all();</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(100));</div><div class="code_line">&nbsp;&nbsp; &nbsp;i = 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cerr &#60;&#60; &quot;Notifying again...\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cv.notify_all();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main()</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::thread t1(waits, 1), t2(waits, 2), t3(waits, 3), t4(signals);</div><div class="code_line">&nbsp;&nbsp; &nbsp;t1.join(); t2.join(), t3.join(), t4.join();</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825246</guid>
        <pubDate>Tue, 10 Mar 2020 16:41:47 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825246</link>
        <description><![CDATA[JoeUser: <strong class='tag-b'>Qraizer</strong>, да, именно о пуллинге идет речь. потому как не от каждой операционной системы и не по каждому состоянию получишь какое либо сообщение.<br>
Вот я накидал пример того, о чем спрашиваю:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#if __cplusplus &#60; 201703L</div><div class="code_line">#error &quot;C++17 podavai suda!&quot;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;filesystem&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;atomic&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std::chrono_literals;</div><div class="code_line">&nbsp;</div><div class="code_line">std::atomic&#60;bool&#62; BreakFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">std::atomic&#60;bool&#62; TerminateFlag = ATOMIC_FLAG_INIT;</div><div class="code_line">std::string FileName = &quot;C:/Temp/helloworld.txt&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">void ThreadFunc() {</div><div class="code_line">&nbsp;&nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (BreakFlag) break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;try {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if (std::filesystem::exists(FileName)) std::filesystem::remove(FileName);</div><div class="code_line">&nbsp;&nbsp; &nbsp;} catch (...) {}</div><div class="code_line">&nbsp;&nbsp; &nbsp;// std::this_thread::sleep_for(1ms); // Если не раскоментировать - будет жесть, 17-20% жрет CPU!!!</div><div class="code_line">&nbsp;&nbsp;} while (true);</div><div class="code_line">&nbsp;&nbsp;TerminateFlag = true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp;std::string str;</div><div class="code_line">&nbsp;&nbsp;std::thread Thread(ThreadFunc);</div><div class="code_line">&nbsp;&nbsp;Thread.detach();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;Type \&quot;Exit\&quot; to exit...&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;do {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cin &#62;&#62; str;</div><div class="code_line">&nbsp;&nbsp;} while (str != &quot;Exit&quot;);</div><div class="code_line">&nbsp;&nbsp;BreakFlag = true;</div><div class="code_line">&nbsp;&nbsp;while (!TerminateFlag) std::this_thread::yield();</div><div class="code_line">&nbsp;&nbsp;std::cout &#60;&#60; &quot;Done.&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><br>
Прога элементарная. Ждет написания в консоли слова Exit и нажатие [Enter]. А пока ждет - работает. А именно ищет файл &quot;C://Temp//helloworld.txt&quot; и если находит - грохает его. <br>
<br>
Перепишите мне с мьютексами, семафорами, или condition_variable чтобы стало лучше/правильнее. И что именно станет правильнее и лучше?<br>
<br>
ЗЫ: Если раскоментить std::this_thread::sleep_for(1ms) - загрузка CPU у меня 0%]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825244</guid>
        <pubDate>Tue, 10 Mar 2020 16:37:33 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825244</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825241'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T15:45:15+00:00">10.03.20, 15:45</time></span><div class='quote '>Советовали и мьютексы, и семафоры, и cоndition_variable. Но куда тут их всунуть? Кто извне (из другого треда) будет их забирать-отпускать?</div></div><br>
А ранее ты сам же на этот вопрос и отвечаешь :D :<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825241'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T15:45:15+00:00">10.03.20, 15:45</time></span><div class='quote '>Так вот первую функцию я не могу использовать по одной простой причине - <strong class='tag-b'>пока она бесконечно висит я не могу завершить поток нормальным способом если вдруг мне это надо. Поэтому я использую вторую функцию с указанием тайм аута. Нет данных - пошла очередная итерация цикла. А вот в ней я уже могу анализировать BreakFlag. Если увижу что взведен - выхожу из цикла и завершаю поток.</strong></div></div><br>
На сколько я понял у тебя это как раз взаимосвязано. Там где тебе нужно поменять флаг - там ты пишешь notify_one/notify_all, там где у тебя флаги проверяются - ты пишешь wait/wait_for/wait_until/etc.<br>
У тебя по условию задачи - есть сигнал и есть его обработчик. Сейчас ты это все разруливаешь флагами, у тебя в каком то месте флагу присваивается значение true, а в другом месте этот самый флаг на значение true проверяется. Тебе в том месте - где присваивается значение флагу true - нужно изменить условие(поменять значение на true своему флагу например) и вызвать notify, а в том месте - где у тебя флаг проверяется тебе нужно заюзать wait_for. Что тут непонятного то? :-?]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825242</guid>
        <pubDate>Tue, 10 Mar 2020 16:23:14 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825242</link>
        <description><![CDATA[Qraizer: <strong class='tag-b'>JoeUser</strong>, давай пройдёмся по теории. Её тут уже коснулись, но систематизировать не помешает.<br>
Итак, существует два варианта реакции на изменившиеся окружающие условия: либо тебе об этом кто-то сообщает, и тогда нет проблем, вешаешься на сигнал и ждёшь; либо никаких нотификаций не предусмотрено, тогда у тебя остаётся вариант пуллить это событие самостоятельно. Второй вариант, вообще говоря, сводится к первому, надо лишь самому реализовать эту нотифю, вопрос лишь в том, стоит ли. Но как бы там ни было, в первом случае задача решена до тебя, и этот вариант уже рассматривался выше, но по ходу это не тот вариант, который тебя интересует, так что второй.<br>
Любой пуллинг основан на периодическом опросе. Вопрос о его реализации, думаю, стоит не в том ключе, мол, как это сделать, а в том, мол, как это сделать эффективно. <strong class='tag-b'>Wound</strong> тебе предложил условные переменные, что даёт половину решения, основанное на нотификациях, условия которых ты сам же и определяешь. Не самое удобное, возможно, зато универсальное: написал один раз и забыл. Вторая половина упирается в то, что нельзя ничего сказать о величине периода опроса, т.к. это сильно зависит от характера процесса, чьё состояние опрашивается. И от него же зависит формулировка условия для нотификации.<br>
К примеру, опрос своего файлика ты можешь оформить просто как<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::condition_variable cv;</div><div class="code_line">std::mutex cv_m;</div><div class="code_line">&nbsp;</div><div class="code_line">using namespace std::chrono_literals;</div><div class="code_line">&nbsp;</div><div class="code_line">/* ... */</div><div class="code_line">std::unique_lock&#60;std::mutex&#62; lk(cv_m);</div><div class="code_line">cv.wait_for(lk, 1s, []{ return std::filesystem::exists(&quot;helloworld.txt&quot;); });</div></ol></div></div></div></div>Как бы с этим проблем нет. Точное время опроса и точных критериев нотификации тебе никто в общем случае не подскажет.<br>
Проблема же всплывает, если тебе нужно отслеживать несколько нотификаций сразу и по-разному на них реагировать. Ну так выше я уже писал, что условие ты можешь поставить любое. Напиши что-то типа<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">std::atomic&#60;bool&#62; break_event = false;</div><div class="code_line">/* ... */</div><div class="code_line">cv.wait_for(lk, 1s, []{ return std::filesystem::exists(&quot;helloworld.txt&quot;) || break_event; });</div></ol></div></div></div></div>И снова никто не подскажет общего случая, условия могут быть самыми разными.<br>
<br>
P.S. В принципе при таком подходе уже и таймаут не нужен.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825241</guid>
        <pubDate>Tue, 10 Mar 2020 15:45:15 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825241</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825235'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>shm &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T12:39:51+00:00">10.03.20, 12:39</time></span><div class='quote '>Вопрос странный. Поток может быть в 2 состояниях: активным и в спячке. В спячке поток ожидает событий для пробуждения. События могут быть сгенерированы в пользовательском коде (в других потоках) или ОС как ответ на ожидание каких-то аппаратных событий, например, тех же данных на COM порту.</div></div><br>
<br>
Ну попробую еще раз объяснить ...  :wall: Как-то недавно Киля мне порекомендовал <a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=416823' target='_blank'>либу Interception</a>. Процесс чтения данных там можно осуществлять двумя функциями (вернее ожидание данных на устройстве):  <br>
<br>
1) interception_wait<br>
2) interception_wait_with_timeout<br>
<br>
Так вот первую функцию я не могу использовать по одной простой причине - пока она бесконечно висит я не могу завершить поток нормальным способом если вдруг мне это надо. Поэтому я использую вторую функцию с указанием тайм аута. Нет данных - пошла очередная итерация цикла. А вот в ней я уже могу анализировать BreakFlag. Если увижу что взведен - выхожу из цикла и завершаю поток.<br>
<br>
Советовали и мьютексы, и семафоры, и cоndition_variable. Но куда тут их всунуть? Кто извне (из другого треда) будет их забирать-отпускать?<br>
<br>
А вот теперь, допустим, другая похожая задача.<br>
<br>
Я должен осуществлять другую операцию в потоке - вместо interception_wait_with_timeout ... что нибудь типа std::filesystem::exists(&quot;helloworld.txt&quot;). И если файл найден - удалять. Делать пока поток не будет прерван. Если sleep в цикл не поставлю - &quot;комп через час-два закипит&quot;?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825240</guid>
        <pubDate>Tue, 10 Mar 2020 15:20:20 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825240</link>
        <description><![CDATA[Wound: К слову, зачем тебе там нужен WaitForMultiplyObjects ? Почему сам цикл не переделать как то так?<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">while(!BreakFlag)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::unique_lock&#60;std::mutex&#62; lk(cv_m);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(cv.wait_for(lk, std::chrono::milliseconds(100000), [](){return ReadyFlag;}))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ //! ReadyFlag is true</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;doSomething();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; { //! timeout</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">}</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T15:27:16+00:00">10.03.20, 15:27</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>А программа всего лишь что и делает в фоне - только мониторит состояние фискального аппарата (если я не ошибаюсь по COM-порту).</div></div><br>
К слову:<br>
<a class='tag-url' href='https://ru.wikipedia.org/wiki/%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80_(%D1%81%D0%B8%D0%BD%D1%85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)' target='_blank'>Монитор</a><br>
Очень познавательная статья. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T15:30:42+00:00">10.03.20, 15:30</time></span></span><br>
Ну или еще для любителей велосипедов решение на семафорах, то что судя по всему предлагал <strong class='tag-b'>ЫукпШ</strong>: <a class='tag-url' href='https://habr.com/ru/post/261273/' target='_blank'>https://habr.com/ru/post/261273/</a>]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825237</guid>
        <pubDate>Tue, 10 Mar 2020 13:50:01 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825237</link>
        <description><![CDATA[Qraizer: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825216'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T08:29:30+00:00">10.03.20, 08:29</time></span><div class='quote '>Я загуглил, на SO ответили однозначно, что нужен велосипед (You can&#39;t, and must redesign), т.к. conditial variable только одно состояние отслеживает.</div></div>На условной переменной ты можешь собрать произвольной сложности условие. Получить аналог WaitForMultipleObjects() несложно.]]></description>
        <author>Qraizer</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825235</guid>
        <pubDate>Tue, 10 Mar 2020 12:39:51 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825235</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825223'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:06:55+00:00">10.03.20, 10:06</time></span><div class='quote '>У меня же был вопрос более общий - как отдавать кванты вычислений не привязываясь к API Win32 если используется неблокирующая обработка &quot;любого толка&quot;?</div></div><br>
Вопрос странный. Поток может быть в 2 состояниях: активным и в спячке. В спячке поток ожидает событий для пробуждения. События могут быть сгенерированы в пользовательском коде (в других потоках) или ОС как ответ на ожидание каких-то аппаратных событий, например, тех же данных на COM порту. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T12:40:46+00:00">10.03.20, 12:40</time></span></span><br>
Короче мне сама формулировка &quot;отдать квант&quot; непонятна. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T12:44:31+00:00">10.03.20, 12:44</time></span></span><br>
Есть еще такая замечательная функция как std::this_thread::yield(). С помощью нее ты говоришь ОС &quot;моему потоку сейчас делать нечего, пускай поработают другие&quot;. При этом, если в ОС есть потоки не в спячке, то им реально будет передано управление. Если таких нет, то ты получишь управление сразу же обратно и как следствие та же загрузка ядра на максимум. Считается, что наличие yield() и подобных функций в коде - это признак кривой архитектуры.]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825233</guid>
        <pubDate>Tue, 10 Mar 2020 12:32:22 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825233</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825227'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:34:04+00:00">10.03.20, 10:34</time></span><div class='quote '>А в нем как разгружать CPU в ожидании?<br>
<br>
Да, я знаю, что существует интересная либа libevent, которая эмулирует кросс-платформенно систему уведомлений (сообщений). Но вопрос был в другом - как стандартными средствами C++11 и выше разгружать CPU?</div></div><br>
Вот в этом и заключается преимущество подхода на основе conditional variable. Они не нагружают CPU, и реально ждут оповещения(плюс нужно учитывать что случаются ложные пробуждения, но они очень просто лечатся).<br>
Т.е. они работают как события и при этом не грузят аппаратный поток, как в случае с флагами. Ровно так же работают промисы, но у них есть одна ложга дегтя, их можно установить только 1 раз, в отличии от conditional variable.<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825228'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:38:58+00:00">10.03.20, 10:38</time></span><div class='quote '>Киля, ты всегда рвешься в бой быстрее танка. Начинаешь сразу рубить с плеча, или обижаться. Пойми, я никак не принижаю твои достоинства как программера, и очень часто тебе благодарен. Но я считаю, что ты очень часто спешишь не разобравшись. А ведь не всегда удается задать вопрос так, чтобы непоняток не было вообще ... если вопрос конечно ну не совсем уж тривиальный. Без обид&#33; <br>
</div></div><br>
Так задай его так, чтоб было понятно на него отвечать.]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825230</guid>
        <pubDate>Tue, 10 Mar 2020 10:48:09 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825230</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825227'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:34:04+00:00">10.03.20, 10:34</time></span><div class='quote '>Unix система. Второй поток, который висит &quot;на семафорах&quot; должен распечатать файл в STDOUT, если файл он появился в каталоге. Ну или должен завершиться, если завершается вся программа. Получается, что должен быть еще один поток (третий), который уведомит второй поток, что файл появился. А в нем как разгружать CPU в ожидании?</div></div><br>
1 Про выход - если приложение завершается, значит будет вызван<br>
деструктор объекта-потока. Из деструктора будет установлен<br>
семафор &quot;Exit&quot;, а потом ожидание завершения потока (pthread_join).<br>
Рабочий поток завершиться по семафору. На случай проблем<br>
предусмотрим принудительное уничтожение потока, если будет<br>
превышено время допустимого ожидания завершения.<br>
<br>
2. Если ты что-то там ожидаешь в событийной модели, значит<br>
копай доки для твоего случая.<br>
Если нет таких событий - тогда никак. Тогда надо ждать в цикле со Sleep-ом.<br>
И семафор тоже можно опрашивать в таком цикле.<br>
--<br>
Кроме того, у Юникса есть функции ожидания - Select, например.<br>
Работает с файловыми дескрипторами.<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
На просторах Сети я узнал про такой финт ушами:<br>
- для создания события на выход из цикла был создан pipe и его<br>
хэндл тоже был передан Select-у. Для выхода достаточно было<br>
послать символ в pipe.<br>
</div></div><br>
<br>
Надо заметить, что цикл со Sleep-ом это не криминал.<br>
Однако, чем меньше будет таких решений, тем меньше<br>
будет бессмысленно истраченного времени.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825228</guid>
        <pubDate>Tue, 10 Mar 2020 10:38:58 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825228</link>
        <description><![CDATA[JoeUser: <div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825226'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:28:04+00:00">10.03.20, 10:28</time></span><div class='quote '>А я ниче и не советовал. Просто посетовал, что опять будешь всех дураками выставлять</div></div><br>
Киля, ты всегда рвешься в бой быстрее танка. Начинаешь сразу рубить с плеча, или обижаться. Пойми, я никак не принижаю твои достоинства как программера, и очень часто тебе благодарен. Но я считаю, что ты очень часто спешишь не разобравшись. А ведь не всегда удается задать вопрос так, чтобы непоняток не было вообще ... если вопрос конечно ну не совсем уж тривиальный. Без обид&#33; :) </div></div>]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825227</guid>
        <pubDate>Tue, 10 Mar 2020 10:34:04 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825227</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825224'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:23:39+00:00">10.03.20, 10:23</time></span><div class='quote '>Значит надо остановить поток и ждать 2 объекта, я предлагаю семафоры.</div></div><br>
Я тебя понял&#33; Только тут получается какой-то замкнутый круг ... Вот представь пример. Unix система. Второй поток, который висит &quot;на семафорах&quot; должен распечатать файл в STDOUT, если файл он появился в каталоге. Ну или должен завершиться, если завершается вся программа. Получается, что должен быть еще один поток (третий), который уведомит второй поток, что файл появился. А в нем как разгружать CPU в ожидании?<br>
<br>
Да, я знаю, что существует интересная либа <a class='tag-url' href='http://libevent.org' target='_blank'>libevent</a>, которая эмулирует кросс-платформенно систему уведомлений (сообщений). Но вопрос был в другом - как стандартными средствами C++11 и выше разгружать CPU?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825226</guid>
        <pubDate>Tue, 10 Mar 2020 10:28:04 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825226</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825225'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:23:42+00:00">10.03.20, 10:23</time></span><div class='quote '>А как можно начинать советовать, если не выяснил? </div></div><br>
А я ниче и не советовал. Просто посетовал, что опять будешь всех дураками выставлять :-?]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825225</guid>
        <pubDate>Tue, 10 Mar 2020 10:23:42 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825225</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825221'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T09:41:48+00:00">10.03.20, 09:41</time></span><div class='quote '>Во первых твоя задача не ясна. Я лично вообще не понимаю что ты делаешь.</div></div><br>
А как можно начинать советовать, если не выяснил? :blink:]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825224</guid>
        <pubDate>Tue, 10 Mar 2020 10:23:39 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825224</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825223'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T10:06:55+00:00">10.03.20, 10:06</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825217'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T09:01:03+00:00">10.03.20, 09:01</time></span><div class='quote '>В качестве флагов можно использовать семафоры.</div></div><br>
А чем хуже std::atomic?</div></div><br>
Это не о том - насколько я понимаю.<br>
я не про атомарность говорю, а отвечаю на вопрос по теме - как экономить время.<br>
Для этого надо работать по событиям.<br>
У тебя 2 события в цикле - &quot;выход&quot; и &quot;работа&quot;.<br>
Значит надо остановить поток и ждать 2 объекта, я предлагаю семафоры.<br>
----- <br>
Семафор - это такой объект ядра, который может остановить поток.<br>
И этот поток перестанет тратить процессорное время вообще.<br>
Кроме того, у него имеется полезное свойство - если будет<br>
получено несколько (много) уведомлений о событии, в то время<br>
как текущее событие всё ещё обрабатывается, ни одно <br>
из уведомлений не будет утеряно.<br>
Рабочий поток будет разбужен семафором столько раз, сколько<br>
надо.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825223</guid>
        <pubDate>Tue, 10 Mar 2020 10:06:55 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825223</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825217'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T09:01:03+00:00">10.03.20, 09:01</time></span><div class='quote '>В качестве флагов можно использовать семафоры.</div></div><br>
А чем хуже std::atomic? <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T10:22:33+00:00">10.03.20, 10:22</time></span></span><br>
<strong class='tag-b'>shm</strong>, сорь&#33; Чтение из COM-порта я в начале привел для примера. А так я работаю с USB с помощью либы, которую мне присоветовал Киля. Там есть хорошая функция <strong class='tag-b'>interception_wait_with_timeout</strong> и она решает мою проблему (т.к. в глубине либы она завязана на WaitForMultiplyObjects с тайм аутом).<br>
У меня же был вопрос более общий - как отдавать кванты вычислений не привязываясь к API Win32 если используется неблокирующая обработка &quot;любого толка&quot;?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825221</guid>
        <pubDate>Tue, 10 Mar 2020 09:41:48 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825221</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825216'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T08:29:30+00:00">10.03.20, 08:29</time></span><div class='quote '>Я вообще не пойму как использовать для опроса устройства. На каждое считывание запускать заново поток? И что это даст?<br>
И второй момент, а как мне прервать такой поток, если ты мне далее предлагаешь<br>
</div></div><br>
Во первых твоя задача не ясна. Я лично вообще не понимаю что ты делаешь. Ты привел кусок кода - и говоришь: как мне его нужно переписать, чтоб было правильно. Из твоего кода ясно что у тебя есть два флага - флаг готовности и флаг завершения программы. <br>
За что отвечает флаг готовности? Флаг готовности для чего? Как он взаимосвязан с остальной логикой? Может быть этот флаг означает что очередь не пуста? Или он означает что произошло какое то событие? События реализуются с помощью conditional_variable, ну как вариант, у них есть свои достоинства и недостатки. Помимо conditional_variable, можно использовать get_future().wait/std::promise::set_value, но эта штука одноразовая, в отличии от CV.<br>
Еще ты можешь получить хендл потока <a class='tag-url' href='https://en.cppreference.com/w/cpp/thread/thread/native_handle' target='_blank'>std::thread::native_handle()</a> и юзать WaitForMultiplyObjects.<br>
<br>
Например какой то пример эмуляции WaitForMultiplyObjects:<br>
<a class='tag-url' href='http://coliru.stacked-crooked.com/a/1dfb87728994b184' target='_blank'>http://coliru.stacked-crooked.com/a/1dfb87728994b184</a><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;vector&#62;</div><div class="code_line">#include &#60;thread&#62;</div><div class="code_line">#include &#60;future&#62;</div><div class="code_line">#include &#60;chrono&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">const int TIME_BETWEEN_POLLS_MS = 50;</div><div class="code_line">&nbsp;</div><div class="code_line">// Wait (sleep) between polls until a task is finished then return index.</div><div class="code_line">template &#60;typename Iterator&#62;</div><div class="code_line">Iterator finishingThread(Iterator first, Iterator last) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto it = first;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto status = std::future_status::timeout;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (status != std::future_status::ready) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (++it == last) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;it = first;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;status = it-&#62;wait_for(std::chrono::milliseconds(TIME_BETWEEN_POLLS_MS));</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;return it;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">// Example task function that sleeps for specified time and returns thread id.</div><div class="code_line">std::thread::id sleepFor(int millisec) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(std::chrono::milliseconds(millisec));</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Terminating thread with id: &quot; &#60;&#60; std::this_thread::get_id() &#60;&#60; std::endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return std::this_thread::get_id();</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int main() {</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Create three separate tasks.</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::packaged_task&#60;std::thread::id(int)&#62; task1{sleepFor},</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task2{sleepFor},</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; task3{sleepFor};</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Store futures.</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::future&#60;std::thread::id&#62;&#62; futures;</div><div class="code_line">&nbsp;&nbsp; &nbsp;futures.push_back(task1.get_future());</div><div class="code_line">&nbsp;&nbsp; &nbsp;futures.push_back(task2.get_future());</div><div class="code_line">&nbsp;&nbsp; &nbsp;futures.push_back(task3.get_future());</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Run tasks on separate threads.</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::vector&#60;std::thread&#62; tasks;</div><div class="code_line">&nbsp;&nbsp; &nbsp;tasks.emplace_back(std::move(task1), 1500);</div><div class="code_line">&nbsp;&nbsp; &nbsp;tasks.emplace_back(std::move(task2), 500);</div><div class="code_line">&nbsp;&nbsp; &nbsp;tasks.emplace_back(std::move(task3), 1000);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;auto it = finishingThread(std::begin(futures), std::end(futures));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;We have result of the task that finished first!&quot; &#60;&#60; std::endl;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;// Join threads.</div><div class="code_line">&nbsp;&nbsp; &nbsp;for (auto&amp; t : tasks) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;t.join();</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::cout &#60;&#60; &quot;Winner result: &quot; &#60;&#60; it-&#62;get() &#60;&#60; std::endl;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825218</guid>
        <pubDate>Tue, 10 Mar 2020 09:05:52 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825218</link>
        <description><![CDATA[shm: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>Какие варианты есть лучше? </div></div><br>
Что мешает читать из COM порта с таймаутом? Как данные придут, то функция сразу вернет управление.<br>
Второй вариант: использовать асинхронное API для работы с COM портом. Бонус: не нужен даже доп. поток. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T09:08:25+00:00">10.03.20, 09:08</time></span></span><br>
По первому варианту SetCommTimeouts в помощь. Если прямо по байту хочешь вычитывать, то ReadIntervalTimeout ставишь в 1. ReadTotalTimeoutConstant во что-нибудь адекватное, чтобы не завис поток, если данных нет. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T09:09:03+00:00">10.03.20, 09:09</time></span></span><br>
По второму тоже примеров в сети куча. Смысл в том, что ты будешь висеть на WaitForMultipleObjects пока не придут данные. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T09:14:03+00:00">10.03.20, 09:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>Отвечают что-то в роде &quot;нам важно, чтобы система с фискальным аппаратом работала без задержек, мы лучше знаем&quot;</div></div><br>
Вызов ClearCommError в бесконечном цикле никак не улучшит отклик. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-03-10T09:14:49+00:00">10.03.20, 09:14</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>Но для кросс-платформенной реализации такой вариант - не выход. </div></div><br>
boost::asio, только за неимением возможности установить таймаут на порт у тебя нет альтернатив, кроме как использовать асинхронные функции]]></description>
        <author>shm</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825217</guid>
        <pubDate>Tue, 10 Mar 2020 09:01:03 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825217</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>.. Есть только флаг готовности... Что-то типа:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">do {</div><div class="code_line">&nbsp;&nbsp;if (BreakFlag) break;</div><div class="code_line">&nbsp;&nbsp;if (!ReadyFlag) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(1ms);</div><div class="code_line">&nbsp;&nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;doSomething();</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">} while(true);</div></ol></div></div></div></div><br>
<br>
Какие варианты есть лучше?</div></div><br>
В качестве флагов можно использовать семафоры.<br>
Которые есть и у Виндус, и у Юникс.<br>
Значит, можно сделать до некоторой степени аналог WaitForMultipleObjects.<br>
Те сделать функцию, которая ждёт много семафоров.<br>
И по включению каждого вызывает конкретный обработчик.<br>
Либо использовать кросс-платформенную библиотеку.<br>
Где всё это должно быть.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825216</guid>
        <pubDate>Tue, 10 Mar 2020 08:29:30 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825216</link>
        <description><![CDATA[JoeUser: Если ты про тему &quot;<a class='tag-url' href='https://forum.sources.ru/index.php?showtopic=416856' target='_blank'>Распараллеливание выполнения без блокировок</a>&quot;, то там акцент был не про сабж, а скорее о параллельном доступе к данным. <br>
<br>
Ну а твой совет типа:<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3821553'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-02-20T04:55:21+00:00">20.02.20, 04:55</time></span><div class='quote '>1) Вместо std::thread - используй std::future в связке с async (это следует делать в 95% случаях, по крайней мере так советует Майерс, и я ему верю, хотя некоторые не согласны с этим утверждением, но все же) - потому что std::thread имеют кучу подводных камней(читай Майерса)</div></div><br>
<br>
Я вообще не пойму как использовать для опроса устройства. На каждое считывание запускать заново поток? И что это даст? <br>
И второй момент, а как мне прервать такой поток, если ты мне далее предлагаешь<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3821553'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Wound &#064; <time class="tag-quote__quoted-time" datetime="2020-02-20T04:55:21+00:00">20.02.20, 04:55</time></span><div class='quote '>2) Вместо std::atomic&lt;ololo&gt; flag - используй <strong class='tag-b'>conditial variable</strong>s.</div></div><br>
Мне ведь два состояния нужно отслеживать - чтение и прерывание цикла чтения. Я загуглил, на<a class='tag-url' href='https://stackoverflow.com/questions/27341029/what-is-the-best-way-to-wait-on-multiple-condition-variables-in-c11' target='_blank'> SO ответили однозначно</a>, что нужен велосипед (You can&#39;t, and must redesign), т.к. conditial variable только одно состояние отслеживает.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825204</guid>
        <pubDate>Tue, 10 Mar 2020 05:51:10 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825204</link>
        <description><![CDATA[Wound: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=417612&view=findpost&p=3825203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-03-10T04:42:05+00:00">10.03.20, 04:42</time></span><div class='quote '>Какие варианты есть лучше? </div></div><br>
Лучше тебе предлагали в прошлой теме, но ты их принял в штыки, а оппонентов выставил дураками.  :-? <br>
Вангую тут будет ровно тоже самое.]]></description>
        <author>Wound</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825203</guid>
        <pubDate>Tue, 10 Mar 2020 04:42:05 +0000</pubDate>
        <title>Разгрузка CPU в потоке</title>
        <link>https://forum.sources.ru/index.php?showtopic=417612&amp;view=findpost&amp;p=3825203</link>
        <description><![CDATA[JoeUser: Всем привет&#33;<br>
<br>
Возник вот какой вопрос ... В одной из программ, которую подогнали разработчики, постоянная загрузка CPU висит в районе 25%. И это на Core i3 2.5GHz. А программа всего лишь что и делает в фоне - только мониторит состояние фискального аппарата (если я не ошибаюсь по COM-порту).  Все мои попытки убедить разработчиков, что это нонсенс, упираются в &quot;стену&quot;. Отвечают что-то в роде &quot;нам важно, чтобы система с фискальным аппаратом работала без задержек, мы лучше знаем&quot; :wall: Я подозреваю, что залепили в своем коде что-то в виде:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">do {</div><div class="code_line">&nbsp;&nbsp;if (BreakFlag) break;</div><div class="code_line">&nbsp;&nbsp;if (!ReadyFlag) continue;</div><div class="code_line">&nbsp;&nbsp;doSomething();</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">} while(true);</div></ol></div></div></div></div><br>
Ну Ктулху - им судья&#33;  :no-sad: А вот теперь мне в своей проге понадобилось сделать что-то подобное. Понимаю, что идеальным вариантом можно было бы  использовать WaitForMultipleObjects. Но для кросс-платформенной реализации такой вариант - не выход. А похожей блокирующей функции у меня в распоряжении нет. Есть только флаг готовности. Вот собственно вопрос - на сколько я повторю ситуацию, описанную в начале поста, если это реализую подобным образом, но с усыплением потока? Что-то типа:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">do {</div><div class="code_line">&nbsp;&nbsp;if (BreakFlag) break;</div><div class="code_line">&nbsp;&nbsp;if (!ReadyFlag) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;std::this_thread::sleep_for(1ms);</div><div class="code_line">&nbsp;&nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;doSomething();</div><div class="code_line">&nbsp;&nbsp;...</div><div class="code_line">} while(true);</div></ol></div></div></div></div><br>
<br>
Какие варианты есть лучше?]]></description>
        <author>JoeUser</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	