Я только начал смотреть на го и как работает параллелизм в го.
Мне просто интересно, если бы вы могли реализовать что-то такое же в C ++ и нашел boost.fiber.
Какая разница между горутинами и добавочными волокнами?
Не могли бы вы реализовать что-то вроде goroutine с этими волокнами в C ++?
Итак, из того, что я мог бы извлечь из исходного кода библиотеки boost.fiber, кажется, что это действительно НАМНОГО более универсально и мощно, чем goroutines. Мантра goroutines состоит в том, чтобы не обмениваться данными между сопрограммами, а скорее передавать данные в них по мере необходимости. По-видимому, это возможно и в волокнах с каналами (boost::fibers::unbounded_channel<T>
а также boost::fibers::bounded_channel<T>
), хотя я хотел бы иметь в виду, что данные безопасно распределяются между всеми волокнами в одном потоке. Это управляется (с помощью мьютексов, я полагаю), чтобы гарантировать, что одновременно работает только одно волокно, так что вам может не понадобиться каналы для конкретного случая использования.
Кажется, что волокно также дает вам контроль над синхронизацией волокон внутри потоков. Очевидно, что блоки ввода / вывода будут блокировать весь поток, в котором находится волокно, на котором выполняется операция, что имеет смысл. Круче то, что вы можете использовать Fiber для имитации блокировки (например, для строгого порядка рутинного планирования), если это необходимо. Здесь есть довольно хороший пример пользовательского планирования волокон на основе приоритетной очереди https://github.com/olk/boost-fiber/blob/master/examples/priority.cpp также. Тем не менее, я был бы готов поспорить, что планирование по умолчанию чередует их
Итак, просто подытожив, кажется, что основные моменты, которые нужно убрать, — это то, что да, Fibers уже реализовали подобные goroutine вещи. У вас есть каналы, вы можете использовать многопоточность (и я уверен, что это может быть расширено до многоядерного веселья), и вы можете запускать асинхронные операции в одном и том же потоке (опять же, я предполагаю, что они по умолчанию планируют чередование в одном потоке ). Волокна, по-видимому, имеют гораздо больше общей памяти с коммутацией контекста и безопасной волоконно-оптической связью, в то время как go имеет тенденцию ограничивать передачу данных по каналам.
Честно говоря, вам придется немного поработать над базой кода, как я, чтобы увидеть, что еще есть у Fibers, но да, я бы сказал, что это некоторые основные различия.
Других решений пока нет …