Как преобразовать код модели синхронной блокировки совместно используемой памяти в асинхронные сопрограммы, работающие в пуле потоков?
Хотя есть много решений, частично соответствующих моему вопросу, я хотел бы знать, существует ли полное совпадение. Трудно найти полное решение, потому что эти частичные занимают результаты поиска. Это должна быть среда выполнения и (необязательно) преобразование, необходимое для исходного кода, когда язык не поддерживает сопрограммы.
Такие библиотеки, как lthread, имеют API lthread_cond_wait (), но каждый lthread ограничен одним pthread. Я бы хотел, чтобы легкие нити могли работать в несколько потоков. Они должны быть произвольно выбраны пулом потоков. Однопоточные планировщики или планировщики глобальной блокировки не совпадают. Я думаю, что мы можем сделать лучше.
lthreads также не вариант, потому что он не включает преобразование исходного кода и не избегает его, как protothreads.
Некоторые среды выполнения с зелеными потоками (Erlang, Limbo) не совпадают, потому что они ограничены только моделью CSP (передача последовательных процессов), но я хотел бы также иметь примитивы синхронизации модели совместно используемой памяти: мьютексы, переменные условия, rwlocks.
Преобразование включает в себя:
- Преобразование стековых контекстов в объекты в куче
- Преобразование вызовов мьютекса в манипулирование отключением и активацией заданий в пуле потоков и публикацию-подписку
- Переменные условия также должны быть преобразованы в отношения публикации-подписки
- Было бы хорошо иметь свидание в стиле Ады
Мне не удалось сделать прямую реализацию во время выполнения из-за потенциальных тупиковых ситуаций в механизме публикации-подписки без использования глобальной блокировки или одного потока планировщика, но я все еще думаю, что это возможно.
1 ответ
Отказ от ответственности: это автор.
Вы можете запустить несколько pthread и запустить планировщик lthread в каждом из них (это делается автоматически с помощью вызова lthread_run() в функции pthread). Таким образом, каждый поток будет выполнять кучу потоков.