2014-10-22 3 views
1

Существует ли у C++ какое-либо понятие синхронизации потоков Wait + Wake? Ожидание события, оповещения, объекта и т. Д.? Что-то вроде WaitForSingleObject, WaitOnAddress и т. Д.? Единственное, что я могу найти, это std::thread::join, а также забор/синхронизация, например, замки и std::atomic. Есть ли еще много потоков C++? Будет ли больше в будущем?Стандартная версия библиотеки «Wait for Alert/Event» для потоковой передачи

+0

Да [[[[[[[[[[[[[[ –

+2

FYI: [N4195 'std :: synchronic '] (http://www.open-std.org/JTC1/SC22/WG21/docs/ документы/2014/n4195.pdf) было предложено для C++ 1y. Это похоже на syscall futex/WaitOnAddress. – yohjp

ответ

4

Если вам просто нужна сигнализация между потоками, то C++ 11 имеет Condition Variables. Переменные условия будут блокировать потоки, которым нужен доступ к этой переменной, пока они не будут «сигнализированы» потоком, который первоначально заблокировал ресурс. Вы можете создавать конструкции более высокого уровня, такие как WaitFor, полагая, что вы в порядке с блокировкой уровня потока.

Если вы хотите что-то вроде задач C#, а не как C++ 11 в стандартной библиотеке. В C++ 11 к языку были добавлены только примитивы с потоками, их семантика находится на уровне потока. Попытка реализовать их без добавления некоторых языковых функций в лучшем случае беспорядочна.

Мое следующее предложение, если переменные условия не удовлетворяют, заключается в инвертировании программного управления с помощью обратных вызовов. Библиотеки обработки в реальном времени, такие как OpenMAX и OpenSL ES, не используют «события», они используют обратные вызовы в одном потоке. Эти обратные вызовы - это то, где вы подключаетесь к вашему коду для отправки большего количества данных на устройство или для быстрого хранения данных в другом месте для последующей обработки.

Наконец, посмотрите, можете ли вы изменить свою проблему, чтобы она соответствовала существующей библиотеке. Библиотеки, подобные https://www.threadingbuildingblocks.org/, в значительной степени являются золотым стандартом для потоковой передачи C++. Если есть хорошее решение для общей проблемы, есть хороший шанс, что у них будет один.

+0

Спасибо, я знал, что должна быть хотя бы одна важная особенность потоковой передачи C++ 11, которую я не нашел, и это было std :: condition_variable. Теперь мне просто нужно проверить его, чтобы увидеть, могу ли я развестись с OS-специфическими концепциями синхронизации навсегда;) – VoidStar

1

Есть еще что-нибудь для потоковой передачи 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 теперь включает перечисленные выше функции поддержки параллелизма, многие из которых ранее доступны только через дополнительные библиотеки.

+1

Спасибо, но я знаком со всеми этими понятиями. Я занимаюсь потоками окон (и иногда другими ОС) в течение 10 лет. Я спросил, что может предложить Стандартная библиотека. Стандартная библиотека почти ничего не делала в этой области до C++ 11, поэтому я пытаюсь догнать новейшую, практически доступную кросс-платформенную информацию, предлагаемую в стандартной библиотеке. Я принял другой ответ не потому, что он упомянул концепцию переменной условия, а потому, что он упоминал, что std :: condition_variable - это живая, работающая вещь. – VoidStar

+1

См. Редактирование «Конкуренция на основе задач» и «будущее/обещание» - важный новый способ обработки межпоточной связи. Это все в C++ 11. – Vector

+0

@Vector, если мы рассмотрим все детали в параллелизме C++ 11, мы будем здесь некоторое время. :) – BlamKiwi

Смежные вопросы