- 2.2 Потоки
- Что такое поток?
- Потоки SFML или std::thread?
- Создание потоков с помощью SFML
- Запуск потока
- Остановка потоков
- Приостановка потока
- Защита разделяемых данных
- Защита мьютексов
- Распространенные заблуждения
- 15 правил жизни в потоке
- Правила жизни в потоке:
- 1. В потоке – это совсем не значит, что без цели, планов, обязательств и ориентиров.
- 2. Поток – это когда ваши цели и мечты не противоречат выбору вашего сердца.
- 3. Поток неразрывно связан с телесностью.
- 4. Быть в потоке помогает интуиция.
- 5. Поток требует быть в контакте со своим женским и мужским, формирует баланс чувственного и эмоционального, действенного и интеллектуального внутри себя .
- 6.Поток возникает и живет, когда налаживается взаимообмен энергией с миром.
- 7. Находясь в потоке, важно уметь быть в контакте с тревогой.
- 8. Доверие себе и вера необходимы.
- 9. Творческий настрой и собственное видение – верные спутники потока.
- 10. Самоподдержка и самоценность – наше все.
- 11. В потоке не сразу и не все идеально.
- 12. Поток – это партнерство.
- 13. Поток – это удовольствие.
- 14. Поток – это взросление.
- 15. Поток – это активное воображение.
2.2 Потоки
От переводчика: данная статья является седьмой в цикле переводов официального руководства по библиотеке SFML. Прошлую статью можно найти тут. Данный цикл статей ставит своей целью предоставить людям, не знающим язык оригинала, возможность ознакомится с этой библиотекой. SFML — это простая и кроссплатформенная мультимедиа библиотека. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Оригинальную статью можно найти тут. Начнем.
1. Приступая к работе
- Рисование 2D объектов
- Спрайты и текстуры
- Текст и шрифты
- Формы
- Проектирование ваших собственных объектов с помощью массивов вершин
- Позиция, вращение, масштаб: преобразование объектов
- Добавление специальных эффектов с шейдерами
- Контроль 2D камеры и вида
5. Модуль Audio
- Проигрывание звуков и музыки
- Запись аудио
- Пользовательские потоки аудио
- Спатиализация: звуки в 3D
6. Модуль Network
- Коммуникация с использованием сокетов
- Использование и расширение пакетов
- Веб-запросы с помощью HTTP
- Передача файлов с помощью FTP
Что такое поток?
Большая часть из вас уже знает, что такое поток, однако объясним, что это такое, для новичков в данной теме.
Поток — это по сути последовательность инструкций, которые выполняются параллельно с другими потоками. Каждая программа создает по меньшей мере один поток: основной, который запускает функцию main(). Программа, использующая только главный поток, является однопоточной; если добавить один или более потоков, она станет многопоточной.
Так, короче, потоки — это способ сделать несколько вещей одновременно. Это может быть полезно, например, для отображения анимации и обработки пользовательского ввода данных во время загрузки изображений или звуков. Потоки также широко используется в сетевом программировании, во время ожидания получения данные будет продолжаться обновление и рисование приложения.
Потоки SFML или std::thread?
В своей последней версии (2011), стандартная библиотека C++ предоставляет набор классов для работы с потоками. Во время написания SFML, стандарт C++11 еще не был написан и не было никакого стандартного способа создания потоков. Когда SFML 2.0 был выпущен, было много компиляторов, которые не поддерживали этот новый стандарт.
Если вы работаете с компилятором, который поддерживает новый стандарт и содержит заголовочный файл , забудьте о классах потоков SFML и используйте стандартные классы C++ вместо них. Но, если вы работаете с компилятором, не поддерживающим данный стандарт, или планируете распространять ваш код и хотите добиться полной портируемости, потоковые классы SFML являются хорошим выбором
Создание потоков с помощью SFML
Хватит разглагольствований, давайте посмотрим на код. Класс, дающий возможность создавать потоки с помощью SFML, называется sf::Thread, и вот как это (создание потока) выглядит в действии:
В этом коде функции main и func выполняются параллельно после вызова thread.launch(). Результатом этого является то, что текст, выводимый обеими функциями, смешивается в консоли.
Точка входа в поток, т.е. функция, которая будет выполняться, когда поток запускается, должна быть передана конструктору sf::Thread. sf::Thread пытается быть гибким и принимать различные точки входа: non-member функции или методы классов, функции с аргументами или без них, функторы и так далее. Приведенный выше пример показывает, как использовать функцию-член, вот несколько других примеров.
- non-member функция с одним аргументом:
функтор (функциональный объект):
Последний пример, который использует функтор, является наиболее мощным, поскольку он может принимать любые типы функторов и поэтому делает класс sf::Thread совместимым со многими типами функций, которые напрямую не поддерживаются. Эта функция особенно интересна с лямбда-выражениями C++11 или std::bind.
Если вы хотите использовать sf::Thread внутри класса, не забудьте, что он не имеет стандартного конструктора. Поэтому, вы должны инициализировать его в конструкторе вашего класса в списке инициализации:
Если вам действительно нужно создать экземпляр sf::Thread после инициализации объекта, вы можете создать его в куче.
Запуск потока
После того, как вы создали экземпляр sf::Thread, вы должны запустить его с помощью запуска функции.
launch вызывает функцию, которую вы передали в конструктор нового потока, и сразу же завершает свою работу, так что вызывающий поток может сразу же продолжить выполнение.
Остановка потоков
Поток автоматически завершает свою работу, когда функция, служащая точкой входа для данного потока, возвращает свое значение. Если вы хотите ждать завершения потока из другого потока, вы можете вызвать его функцию wait.
Функция ожидания также неявно вызывается деструктором sf::Thread, так что поток не может оставаться запущенным (и бесконтрольным) после того, как его экземпляр sf::Thread уничтожается. Помните это, когда вы управляете вашими потоками (смотрите прошлую секцию статьи).
Приостановка потока
В SFML нет функции, которая бы предоставляла способ приостановки потока; единственный способ приостановки потока — сделать это из кода самого потока. Другими словами, вы можете только приостановить текущий поток. Что бы это сделать, вы можете вызвать функцию sf::sleep:
sf::sleep имеет один аргумент — время приостановки. Это время может быть выражено в любой единице, как было показано в статье про обработку времени.
Обратите внимание, что вы можете приостановить любой поток с помощью данной функции, даже главный поток.
sf::sleep является наиболее эффективным способом приостановить поток: на протяжении приостановки потока, он (поток) практически не потребляет ресурсы процессора. Приостановка, основанная на активном ожидании, вроде пустого цикла while, потребляет 100% ресурсов центрального процессора и делает… ничего. Однако имейте в виду, что продолжительность приостановки является просто подсказкой; реальная продолжительность приостановки (больше или меньше указанного вами времени) зависит от ОС. Так что не полагайтесь на эту функцию при очень точном отсчете времени.
Защита разделяемых данных
Все потоки в программе разделяют некоторую память, они имеют доступ ко всем переменным в области их видимости. Это очень удобно, но также опасно: с момента параллельного запуска потока, переменные или функции могут использоваться одновременно разными потоками. Если операция не является потокобезопасной, это может привести к неопределенному поведению (т. е. это может привести к сбою или повреждению данных).
Существует несколько программных инструментов, которые могут помочь вам защитить разделяемые данные и сделать ваш код потокобезопасным, их называют примитивами синхронизации. Наиболее распространенными являются следующие примитивы: мьютексы, семафоры, условные переменные и спин-блокировки. Все они — варианты одной и той же концепции: они защищают кусок кода, давая только определенному потоку право получать доступ к данным и блокируя остальные.
Наиболее распространенным (и используемым) примитивом является мьютекс. Мьютекс расшифровывается как «Взаимное исключение». Это гарантия, что только один поток может выполнять код. Посмотрим, как мьютексы работают, на примере ниже:
Этот код использует общий ресурс (std::cout), и, как мы видим, это приводит к нежелательным результатам. Вывод потоков смешался в консоли. Чтобы убедиться в том, что вывод правильно напечатается, вместо того, чтобы быть беспорядочно смешанным, мы защищаем соответствующие области кода мьютексом.
Первый поток, который достигает вызова mutex.lock(), блокирует мьютекс и получает доступ к коду, который печатает текст. Когда другие потоки достигают вызова mutex.lock(), мьютекс уже заблокирован, и другие потоки приостанавливают свое выполнение (это похоже на вызов sf::sleep, спящий поток не потребляет время центрального процессора). Когда первый поток разблокирует мьютекс, второй поток продолжает свое выполнение, блокирует мьютекс и печатает текст. Это приводит к тому, что текст в консоли печатается последовательно и не смешивается.
Мьютекс — это не только примитив, который вы можете использовать для защиты разделяемых данных, вы можете использовать его во многих других случаях. Однако, если ваше приложение делает сложные вещи при работе с потоками, и вы чувствуете, что возможностей мьютексов недостаточно — не стесняйтесь искать другую библиотеку, обладающую большим функционалом.
Защита мьютексов
Не волнуйтесь: мьютексы уже потокобезопасны, нет необходимости их защищать. Но они не безопасны в плане исключений. Что происходит, если исключение выбрасывается, когда мьютекс заблокирован? Он никогда не может быть разблокирован и будет оставаться заблокированным вечно. Все потоки, пытающиеся разблокировать заблокированный мьютекс, будут заблокированы навсегда. В некоторых случаях, ваше приложение будет «заморожено».
Чтобы быть уверенным, что мьютекс всегда разблокирован в среде, в которой он (мьютекс) может выбросить исключение, SFML предоставляет RAII класс, позволяющий обернуть мьютекс в класс sf::Lock. Блокировка происходит в конструкторе, разблокировка происходит в деструкторе. Просто и эффективно.
Помните, что sf::Lock может также быть использован в функциях, которые имеют множество возвращаемых значений.
Распространенные заблуждения
Вещь, часто упускаемая из виду: поток не может существовать без соответствующего экземпляра sf::Thread. Следующий код можно часто увидеть на форумах:
Программисты, которые пишут подобный код, ожидают, что функция startThread() будет запускать поток, который будет жить самостоятельно и уничтожаться при завершении выполнения функции (переданной в качестве точки входа). Этого не происходит. Функция потока блокирует главный поток, как если бы программа не работала.
В чем дело? Экземпляр sf::Thread является локальным для функции startThread(), поэтому немедленно уничтожаются, когда функция возвращает свое значение. Вызывается деструктор sf::Thread, происходит вызов wait(), как утверждалось выше, результатом этого становится блокировка главного потока, который ожидает завершения функции потока, вместо параллельного выполнения с ней.
Так что не забывайте: вы должны управлять экземплярами sf::Thread, чтобы они жили так долго, как требуется функции потока.
Источник
15 правил жизни в потоке
Амбиции, трудоспособность, многозадачность, стрессоустойчивость, гиперответственность – все это рано или поздно приводит к полному выгоранию и, как следствие, к проблемам со здоровьем. После тридцати это стало ощущаться особенно критично. Я много лет проработала sales -менеджером и директором в разных сферах, от моды до инноваций, прежде чем почувствовала, что концепция «достигаторства» перестала меня вдохновлять. Я решила изменить стратегию и начала работать в сферах, которые когда-то были моими хобби: путешествия, йога, психология. Со временем это стало приносить мне не только удовольствие, но и доход не меньший, чем когда-то офисная работа. Самое важное – научиться жить «в потоке», на подъёме, в некотором особом состоянии.
Поначалу это не всегда легко, но постепенно, без насилия над собой получается ловить жизненный поток, который не только позволяет воспроизводить и удерживать большой заряд энергии, но и запускает творческий и денежный потоки.
Правила жизни в потоке:
1. В потоке – это совсем не значит, что без цели, планов, обязательств и ориентиров.
Если человек не сдерживает слово, нарушает границы , не ценит свое и чужое время, то он просто теряется, запутывается, не находит себя и не может войти в свой поток. В потоке может что-то идти не по плану, но это не означает – хаотично. Это как в джазовой музыке: существует тональность, размер, гармония, на которые накладывается импровизация. Да, поток – это джаз. Нужно иметь план А, план Б, план С и – любить и уметь импровизировать.
2. Поток – это когда ваши цели и мечты не противоречат выбору вашего сердца.
Когда они ясны и понятны для вашего подсознания. Когда излишне практичный ум не создает ограничения, а подсознание не вставляет вам «палки в колеса», что мешать верно действовать. Правильная настройка позволяет осознать себя частью большого целого, почувствовать свой поток и встроиться в общий ритм. Медитативные и арт-практики, метафорические карты, работа со снами, архетипами и регулярная личная терапия помогают наладить контакт с бессознательным, слышать его и, скажем так, сотрудничать с ним.
3. Поток неразрывно связан с телесностью.
Ведь именно в теле можно услышать и почувствовать самый честный и правдивый отклик на «моё — не моё», «направо или налево», «остаться или уйти». Именно через тело нарабатывается чувство внутренней опоры и происходит свободное поступление энергии в организм. Основоположник биоэнергетического анализа, психолог, ученый А. Лоуэн, в единое целое связывает такие элементы, как дыхание , движение, чувственность, сексуальность и самовыражение.
4. Быть в потоке помогает интуиция.
Интуицию можно усиливать с помощью постоянной сонастройки с собой и тренировки восприятия. Поначалу нередко ошибаешься, но постепенно опыт дает все более высокий процент правильного выбора решений и действий. Для развития тонкого чувствования в процессуальной телесной терапии существуют специальные техники. Сама я тренируюсь регулярно и продолжаю исследовать и практиковать разные методы развития интуиции.
5. Поток требует быть в контакте со своим женским и мужским, формирует баланс чувственного и эмоционального, действенного и интеллектуального внутри себя .
На языке психоанализа – равновесия анимы и анимуса. Женщинам с преобладанием мужского типа реализации рано или поздно становится тяжело удерживать поток. Эта стратегия уводит женщину от её первозданной природы и порождает внутренние конфликты и психосоматические реакции.
6.Поток возникает и живет, когда налаживается взаимообмен энергией с миром.
В таком состоянии человек становится способным восстанавливать ресурс, отдавать, не уходя в минус, и беспрепятственно получать энергетическую подпитку. Если только берешь или только даешь , рано или поздно этот перекос проявится в реальности. Поток денег – это про поток энергии, про умение быть благодарным за, то что имеешь, про так называемую пропускную способность.
7. Находясь в потоке, важно уметь быть в контакте с тревогой.
Шаги в неизведанное, новые пути, расширение невозможны без осознания этого чувства внутри. Со временем тревогу можно научиться выдерживать и стабилизировать. Чем лучше знаешь и понимаешь себя, тем легче управлять своими состояниями.
8. Доверие себе и вера необходимы.
Если их нет, очень важно восстановить их, а кому-то обрести заново. Существуют методики наработки этих чувств, практика будет иметь накопительный эффект.
9. Творческий настрой и собственное видение – верные спутники потока.
Разрешите себе экспериментировать, пробовать новое, создавать что-то с нуля . Для этого нужна смелость, но результаты приносят огромное удовольствие.
10. Самоподдержка и самоценность – наше все.
Очень важно уметь спокойно и взвешенно принимать свои ошибки, не критиковать каждый шаг, поддерживать и ценить себя независимо от обстоятельств. В потоке приходится взращивать внутреннего поддерживающего взрослого и забирать полномочия у критиков внешних и внутренних.
11. В потоке не сразу и не все идеально.
Но всегда от души и с любовью.
12. Поток – это партнерство.
Поиск своих и бесконечные коллаборации. «Целое — всегда есть нечто большее, чем простая сумма его частей».
13. Поток – это удовольствие.
И умение видеть красоту в обыденных вещах.
14. Поток – это взросление.
Способность самому закрывать свои потребности и брать ответственность на себя. Это не так тяжело, как может представляться, а в итоге – ты всегда оказываешься в лучших обстоятельствах из всех возможных. Только взросление дает свободу.
15. Поток – это активное воображение.
Умение мечтать без ограничений и вдохновение, которое повсюду: природа, люди, искусство, танец, книги, кино, путешествия, дети.
Весна – очень удачное время для вхождения в поток: пробуждающаяся природа, общее предвкушение чего-то нового.
Читайте эту и другие статьи на нашем сайте Organicwoman.ru
Мнение редакции может не совпадать с мнением автора. В случае проблем со здоровьем не занимайтесь самолечением, проконсультируйтесь с врачом. Нравятся наши тексты? Подписывайтесь на канал в Яндекс.Дзен .
Источник