<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Linux Forum &mdash; Синхронизация потоков]]></title>
	<link rel="self" href="https://linuxforum.ru/extern.php?action=feed&amp;tid=11182&amp;type=atom" />
	<updated>2011-02-22T13:02:20Z</updated>
	<generator>PunBB</generator>
	<id>https://linuxforum.ru/viewtopic.php?id=11182</id>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148315#p148315" />
			<content type="html"><![CDATA[<p>Спасибо, zhevak, за такое доходчивое объяснение логики потоков smile</p>]]></content>
			<author>
				<name><![CDATA[DimonK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=13249</uri>
			</author>
			<updated>2011-02-22T13:02:20Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148315#p148315</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148257#p148257" />
			<content type="html"><![CDATA[<p>У многих дома стоят многоядерные процессоры в компах. Круть крутяжная! А толку-то? Только-ли для того, чтобы пальцы гнуть пред одноклассниками? А для чего это все, и как это работает -- не хотели бы узнать?</p><p>Понятно, что чем больше ядер в процессоре, тем он быстрее работает. Это теоретически. А на самом деле как? Понятно, что каждое ядро процессора выполняет свой кусок кода одновременно с работой другого ядра. В этом случае удобно говорить не о ядрах и не о программах, а о <em>потоках исполнения</em>. И даже если у вас одноядерный процессор, потоки исполнения никуда не делись.</p><p>Поток -- это тот участок кода, который выполняется в данный момент времени. Вот такое вот несколько перпендикулярно направленное обывательской логике определение.<br />Итак...</p><br /><p><span style="color: blue"><strong>Потоки исполнения</strong></span></p><br /><p>Потоки зиждутся на событиях. События могут быть как первичные:</p><p>* поступление электрических сигналов от каких-либо устройств,<br />* нажатие на клавиатуру, манипуляции с мышью,<br />* внутренний таймер или часы, ну т.д.</p><p>так и порожденные (вторичные)</p><p>* окончание процесса расчета какого-нибудь блока данных<br />* получение сообщения от другого потока</p><p>Первичные события порождают целую гроздь (куст, поток, дождь! -- называйте как хотите) вторичных событий. Вторичные события могут еще порождать себе подобных и т.д до тех пор, пока все не будет обработано.</p><p>Деятельность программы как раз и состоит в том, что на одно какое-то внешнее событие сделать какую-то конкретную работу. Нет событий -- нет и работы! Но в больших программах очень сложно сразу и в одном месте обработать первичное событие, поэтому большие проги расчленяют на кусочки, которые можно охватить -- на уровни, на потоки, на процессы, каждый из которых понятно как работает, легко отлаживаются и вообще осязаем. А взаимодействие этих кусочков основывается на передаче ими друг другу сообщений (о произошедших событиях).</p><p>Теперь, если такой кусочек кода запустить как отдельный процесс или поток, то он будет ждать сообщений, и только тогда, когда кусочек получает сообщение, он работает. В остальное время он стоит (ну или -- спит), т.е. не тратит мощь процессора. Но получив какое-то сообщение этот кусочек кода начинает бешено работать и может, в свою очередь, породить еще несколько сообщений, которые направит другим кускам кода. Ну прямо как государственная система: Президент подписал Указ и понеслась работа вниз по уровням, вплоть до конечных исполнителей! Ни ли они у нас (государство у программистов) стянули идею. Не важно <img src="https://linuxforum.ru/img/smilies/ab.gif" alt="ab" /></p><p>Теперь давайте посмотрим на первичные события. Если у нас единственный источник событий, то не имеет смысла делить прогу на потоки. Все равно, пока не будет отработано предыдущее событие полностью, приступать к обработке следующего не имеет никакого смысла. Да, конечно, теоретически можно, наверно, что-то и сделать, но, если подумать, все это будет сделано за счет процессорного времени по отработке предыдущего события. Сначала мы должны приостановить отработку предыдущего события, потом переключить проц на отработку следующего, потом вернуться обратно... в общем, бардак в программе! Поэтому такие проги лучше делать однопоточными: закончили работы по отработке текущего события, приступили к отработке следующего. Нет событий -- спим!</p><p>Другое дело, когда у вас в проге имеется два или несколько источников первичных событий. Вот тут уже песня совсем другая! Оба (или несколько) событий нужно отрабатывать одновременно и параллельно. Если мы сможем переключаться с одного потока на другой быстро, то создастся впечатление одновременности их работы. Это понятно. И пока события еще не &quot;повязаны&quot; друг на друга, мы можем их одновременно отрабатывать двумя независимыми потоками.</p><p>Но в какой-то момент возникает условие невозможности продолжать работу по обработке события из первого источника, пока не будут готовы результаты обработки события из второго источника. (Я говорю про первичные источники, про первичные события, а не про порожденные вторичные события. Хотя и там тоже могут возникать коллизии).</p><p>Так вот плавно мы с вами подошли к теме синхронизации потоков. Я не могу тут в коротком своем эссе рассказать все детали этого механизма (И так вот сколько уже накатал!) Но я уверен, что теперь вы можете детали реализации многопоточных программ почерпнуть из многочисленных книг и тырнета.</p><p>Проиграйте все эти процессы, черкаясь на бумаге. Задайте себе вопросы, что должен делать поток в такой-то или такой ситуации -- продолжать ли выполнять свою функцию, или сваливаться в спячку.</p><p>И не бойтесь отправлять потоки в спячку. Назначение потоков -- все время спать и не &quot;жрать&quot; без надобности процессорного времени! Например, в циклах опроса готовности клавиатуры или какого-нибудь флага. И только время от времени при получении событий потоки должны просыпаться, быстро делать свою работу, и снова на печку -- спать!</p>]]></content>
			<author>
				<name><![CDATA[zhevak]]></name>
				<uri>https://linuxforum.ru/profile.php?id=9718</uri>
			</author>
			<updated>2011-02-22T10:12:04Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148257#p148257</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148224#p148224" />
			<content type="html"><![CDATA[<p>Привет всем<br />Простите, что не корректно выразил суть своей проблемы</p><p>Основной поток (потоки мне все-таки легче представлять в понятиях винды) занимается отображением на экране устройства и анализом ответов на посыл. <br />Дочерний поток READ(чтение порта). Это зависит от устройства(оно всегда отвечает на посыл). Время жизни этого потока - до окончания приложения (тут меня смутил pthread_join()). <br />(Есть ли какая-нибудь инфа по потокам для чайников, то что я скачал для меня не очень, что и побудило обратится к Вам).</p><p>Предполагается так: <br />Запускаю прогу; формирую поток READ; в потоке Main отображаю &quot;стартовое окно&quot; табло - посыл данных на устройство - ответ БУДЕТ - возражения не принимаются! Main анализирует ответ.<br /> Допустим, с датчиков пришла сигналка на Main(это еще один поток) - опять обработка и отсыл на устройство - ответ - анализ. Также нажатие кнопки на устройстве - устройство реагирует ответом - анализ. И т.д. <br />Вот по этой причине я предположил многопоточную структуру...</p>]]></content>
			<author>
				<name><![CDATA[DimonK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=13249</uri>
			</author>
			<updated>2011-02-22T08:20:27Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148224#p148224</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148045#p148045" />
			<content type="html"><![CDATA[<p><strong>DimonK</strong>, вы довольно размыто описали суть проблемы. Здесь важно то, чем занят родительский поток.<br />Мысли тут две:<br />1. либо вы ставите барьер (что проще). Тогда родительский поток где-то переходит в режим ожидания, ожидая пока дочерний процесс не взведет флаг о том, что номер порта записан в переменную.<br />2. либо реализуете обмен сообщениями между процессами (это сложнее).</p><p>Реализации всего этого зависит от того, на чем вы пишите и какие библиотеки используете.</p><p><strong>zhevak</strong> вам написал про объединение, полностью поддерживаю.</p>]]></content>
			<author>
				<name><![CDATA[PhilB]]></name>
				<uri>https://linuxforum.ru/profile.php?id=9267</uri>
			</author>
			<updated>2011-02-21T16:21:08Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148045#p148045</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148021#p148021" />
			<content type="html"><![CDATA[<p>Вопросом на вопрос:</p><p>Что будет делать родительский поток, когда данных от дочернего потока нет? Вообще нет. Не знаю. Случилось что-то! Провод порвали, кофе пролили, землетрясение, нашествие саранчи...<br />Да и как-то не логично говорить о Дочернем и Родительском потоке. Потоки равнозначны в этом отношении в отличие от процессов. Лучше говорить о потока А и потоке В, которые обмениваются информацией. Которые -- каждый выполняют свою основную задачу независимо от того, есть для него от другого потока какие-нибудь данные или нет ничего.</p><p>Если потоки жестко синхронизированы друг с другом, то лучше их объединить в один.</p>]]></content>
			<author>
				<name><![CDATA[zhevak]]></name>
				<uri>https://linuxforum.ru/profile.php?id=9718</uri>
			</author>
			<updated>2011-02-21T15:41:17Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148021#p148021</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=148015#p148015" />
			<content type="html"><![CDATA[<p>А зачем два потока, если родительский будет стоять, пока дочерний будет работать?</p>]]></content>
			<author>
				<name><![CDATA[adolfus]]></name>
				<uri>https://linuxforum.ru/profile.php?id=15596</uri>
			</author>
			<updated>2011-02-21T15:18:40Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=148015#p148015</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Синхронизация потоков]]></title>
			<link rel="alternate" href="https://linuxforum.ru/viewtopic.php?pid=147890#p147890" />
			<content type="html"><![CDATA[<p>Привет всем<br />Подскажите, пожалуйста, с решением задачи&nbsp; :rolleyes: : я планирую реализовать несколько потоков. Идет выполнение проги, в дочернем&nbsp; потоке осуществляется чтение порта, и как только значение было получено, оно отправляется в родительский поток. Т.е. мне необходимо приостановить родительский поток по наявности зачения.</p>]]></content>
			<author>
				<name><![CDATA[DimonK]]></name>
				<uri>https://linuxforum.ru/profile.php?id=13249</uri>
			</author>
			<updated>2011-02-21T08:37:02Z</updated>
			<id>https://linuxforum.ru/viewtopic.php?pid=147890#p147890</id>
		</entry>
</feed>
