Существует ли у C++ какое-либо понятие синхронизации потоков Wait + Wake? Ожидание события, оповещения, объекта и т. Д.? Что-то вроде WaitForSingleObject
, WaitOnAddress и т. Д.? Единственное, что я могу найти, это std::thread::join
, а также забор/синхронизация, например, замки и std::atomic
. Есть ли еще много потоков C++? Будет ли больше в будущем?Стандартная версия библиотеки «Wait for Alert/Event» для потоковой передачи
ответ
Если вам просто нужна сигнализация между потоками, то C++ 11 имеет Condition Variables. Переменные условия будут блокировать потоки, которым нужен доступ к этой переменной, пока они не будут «сигнализированы» потоком, который первоначально заблокировал ресурс. Вы можете создавать конструкции более высокого уровня, такие как WaitFor, полагая, что вы в порядке с блокировкой уровня потока.
Если вы хотите что-то вроде задач C#, а не как C++ 11 в стандартной библиотеке. В C++ 11 к языку были добавлены только примитивы с потоками, их семантика находится на уровне потока. Попытка реализовать их без добавления некоторых языковых функций в лучшем случае беспорядочна.
Мое следующее предложение, если переменные условия не удовлетворяют, заключается в инвертировании программного управления с помощью обратных вызовов. Библиотеки обработки в реальном времени, такие как OpenMAX и OpenSL ES, не используют «события», они используют обратные вызовы в одном потоке. Эти обратные вызовы - это то, где вы подключаетесь к вашему коду для отправки большего количества данных на устройство или для быстрого хранения данных в другом месте для последующей обработки.
Наконец, посмотрите, можете ли вы изменить свою проблему, чтобы она соответствовала существующей библиотеке. Библиотеки, подобные https://www.threadingbuildingblocks.org/, в значительной степени являются золотым стандартом для потоковой передачи C++. Если есть хорошее решение для общей проблемы, есть хороший шанс, что у них будет один.
Спасибо, я знал, что должна быть хотя бы одна важная особенность потоковой передачи C++ 11, которую я не нашел, и это было std :: condition_variable. Теперь мне просто нужно проверить его, чтобы увидеть, могу ли я развестись с OS-специфическими концепциями синхронизации навсегда;) – VoidStar
Есть еще что-нибудь для потоковой передачи C++?
Да. Это не глубокие темные секреты - вся довольно общедоступная и легкодоступная информация.
См. cppreference.com -Thread support library.
Для некоторых в глубину, более научная дискуссия, начало здесь: C++ Язык программирования - Четвертый Edition- Бьерн Страуструп:
42. Темы и задачи
42,1. Введение
Стандартная поддержка C++ для параллелизма вводится в учебнике в п. 5.3. В этой главе и в предыдущей главе представлено более подробное и систематическое представление более подробного и подробного описания . Мы называем действие потенциально выполняемым одновременно с другими действиями. Нить представляет собой системное представление возможностей компьютера для выполнения задачи ....
42.2. Резьба
Нить представляет собой абстракцию компьютерного оборудования в отношении вычисления . Потоки стандартной библиотеки C++ предназначены для сопоставления с потоками операционной системы.Мы используем потоки, когда несколько задач в программе должны прогрессировать одновременно. В системе с несколькими обрабатывающими блоками («сердечники») потоки позволяют использовать этих единиц ...
42.3. избежать гонок данных
... Эти простые правила основаны на идее избежать попыток одновременно получить доступ к данным, так как они не требуют блокировок и приводят к максимально эффективным программам. Если они не могут использоваться, например, , потому что для совместного использования большого количества данных используется некоторая форма блокировки: • Мьютексы: Мьютекс (переменная взаимного исключения) - это объект, используемый для , представляет исключительное право на доступ к некоторому ресурсу. Чтобы получить доступ к ресурсу , приобретите мьютексы, доступ, а затем отпустите мьютекс (§5.3.4, §42.3.1). • Переменные условия: Переменная условие является переменная, используемая нить ждать события, генерируемого другой нити или таймером (§5.3.4.1, §42.3.4) ...
42,3. 1. Мьютексы
Мьютекс - это объект, используемый для представления эксклюзивного доступа к некоторому ресурсу . Таким образом, его можно использовать для защиты от гонок данных и до синхронизировать доступ к данным, общим для нескольких потоков. «простой» мьютекс - это самый простой, самый маленький и быстрый мьютекс.
42.4. основе задач Параллелизм
До сих пор в этой главе сосредоточено на механизмах для выполнения параллельных задач : акцент был сделан на нитях, избегая условия гонок, и синхронизации потоков. Для многих параллельных задач я нахожу это сосредоточенным на механизмах, отвлекающих от реальной задачи (sic!) От задания одновременных задач . В этом разделе основное внимание уделяется заданию простого вида задачи : задача, которая делает одну вещь с учетом аргументов и выдает один результат .
42.4.1. будущих и обещают
Как упомянуто в §5.3.5, связь между задачами обрабатываются будущего/обещание парой. Задача помещает свой результат в обещание, и задача, которая нуждается в результате извлекает результат из соответствующего будущего:
42.4.6. асинхронного()
Функция асинхронный() в основном простой интерфейс для пусковой неизвестной сложности. Вызов async() возвращает будущее, где R - это тип результата своей задачи. Например, ...
И продолжить .....
@ Ответ МорфингаДрагона о переменных состояния, безусловно, важен, но для этого существует гораздо больше. Хотя TBB от Intel, безусловно, превосходна, STL для C++ 11 теперь включает перечисленные выше функции поддержки параллелизма, многие из которых ранее доступны только через дополнительные библиотеки.
Спасибо, но я знаком со всеми этими понятиями. Я занимаюсь потоками окон (и иногда другими ОС) в течение 10 лет. Я спросил, что может предложить Стандартная библиотека. Стандартная библиотека почти ничего не делала в этой области до C++ 11, поэтому я пытаюсь догнать новейшую, практически доступную кросс-платформенную информацию, предлагаемую в стандартной библиотеке. Я принял другой ответ не потому, что он упомянул концепцию переменной условия, а потому, что он упоминал, что std :: condition_variable - это живая, работающая вещь. – VoidStar
См. Редактирование «Конкуренция на основе задач» и «будущее/обещание» - важный новый способ обработки межпоточной связи. Это все в C++ 11. – Vector
@Vector, если мы рассмотрим все детали в параллелизме C++ 11, мы будем здесь некоторое время. :) – BlamKiwi
- 1. Что касается потоковой передачи wait/notify
- 2. Для потоковой передачи или не для потоковой передачи
- 3. тестирование python для потоковой передачи
- 4. Как стандартная библиотека потоковой передачи сравнивается с Boost?
- 5. Каковы хорошие клиентские библиотеки для потоковой передачи HLS в Интернете?
- 6. Усиление производительности для потоковой передачи
- 7. Решения для потоковой передачи видео
- 8. API для потоковой передачи звука
- 9. Формат для потоковой передачи видео
- 10. Java-сервлетов для потоковой передачи
- 11. Шаблон проектирования для потоковой передачи
- 12. Альтернатива subprocess.Popen.communicate() для потоковой передачи
- 13. Chromecast: ограничения потоковой передачи
- 14. Доступный кодер для плавной потоковой передачи IIS
- 15. Hub.start - wait for finish
- 16. C++ wait for input
- 17. Веб-клиент для потоковой передачи видео
- 18. упрощение потоковой передачи в python
- 19. Задержка потоковой передачи AVPlayer
- 20. wait for for in loop
- 21. Длина потоковой передачи
- 22. Выполнение пользовательской потоковой передачи
- 23. Использование RtspServer из проекта net7mma для потоковой передачи многоадресной передачи
- 24. Стандартная иерархия заголовков библиотеки
- 25. Ошибка потоковой передачи данных
- 26. DirectDraw лучше Direct3d для потоковой передачи?
- 27. Текст потоковой передачи Android
- 28. Spark Частота потоковой передачи
- 29. Служба потоковой передачи WCF
- 30. OpenCV Форматы потоковой передачи
Да [[[[[[[[[[[[[[ –
FYI: [N4195 'std :: synchronic'] (http://www.open-std.org/JTC1/SC22/WG21/docs/ документы/2014/n4195.pdf) было предложено для C++ 1y. Это похоже на syscall futex/WaitOnAddress. –
yohjp