Вытесняющая многозадачность в C / C ++: может ли выполняющийся поток прерываться каким-либо таймером и переключаться между задачами?
Многие виртуальные машины и среды выполнения на других языках, использующие «зеленые» потоки и тому подобное, реализованы в этих условиях; могут ли приложения C / C ++ делать то же самое?
Если да, то как?
Это будет зависеть от платформы, поэтому, пожалуйста, обсудите это с точки зрения поддержки конкретных платформ для этого; например если есть какая-то магия, которую вы можете сделать в SIGALRM
обработчике в Linux, чтобы поменять местами какой-то внутренний стек (возможно, используя longjmp
?), это было бы здорово!
Я спрашиваю, потому что мне любопытно.
Я несколько лет работал над созданием асинхронных циклов ввода-вывода. При написании асинхронных циклов ввода-вывода я должен быть очень осторожен, чтобы не помещать в цикл дорогостоящие вычисления, поскольку это приведет к DOS цикла.
Поэтому меня интересуют различные способы заставить асинхронный цикл ввода-вывода восстанавливать или даже полностью поддерживать какой-то зеленый поток или такой подход. Например, выборка активной задачи и количества итераций цикла в SIGALRM
, а затем, если обнаруживается, что задача блокируется, переместите все остальное в новый поток или какой-нибудь хитрый вариант этого с желаемым результатом.
В связи с этим недавно были некоторые жалобы на node.js, и в других местах я видел дразнящие комментарии о других средах выполнения, таких как Go и Haskell < / а>. Но давайте не будем уходить слишком далеко от основного вопроса о том, можете ли вы выполнять вытесняющую многозадачность в одном потоке на C / C ++.