Как преобразовать код модели синхронной блокировки совместно используемой памяти в асинхронные сопрограммы, работающие в пуле потоков?

Хотя есть много решений, частично соответствующих моему вопросу, я хотел бы знать, существует ли полное совпадение. Трудно найти полное решение, потому что эти частичные занимают результаты поиска. Это должна быть среда выполнения и (необязательно) преобразование, необходимое для исходного кода, когда язык не поддерживает сопрограммы.

Такие библиотеки, как lthread, имеют API lthread_cond_wait (), но каждый lthread ограничен одним pthread. Я бы хотел, чтобы легкие нити могли работать в несколько потоков. Они должны быть произвольно выбраны пулом потоков. Однопоточные планировщики или планировщики глобальной блокировки не совпадают. Я думаю, что мы можем сделать лучше.

lthreads также не вариант, потому что он не включает преобразование исходного кода и не избегает его, как protothreads.

Некоторые среды выполнения с зелеными потоками (Erlang, Limbo) не совпадают, потому что они ограничены только моделью CSP (передача последовательных процессов), но я хотел бы также иметь примитивы синхронизации модели совместно используемой памяти: мьютексы, переменные условия, rwlocks.

Преобразование включает в себя:

  1. Преобразование стековых контекстов в объекты в куче
  2. Преобразование вызовов мьютекса в манипулирование отключением и активацией заданий в пуле потоков и публикацию-подписку
  3. Переменные условия также должны быть преобразованы в отношения публикации-подписки
  4. Было бы хорошо иметь свидание в стиле Ады

Мне не удалось сделать прямую реализацию во время выполнения из-за потенциальных тупиковых ситуаций в механизме публикации-подписки без использования глобальной блокировки или одного потока планировщика, но я все еще думаю, что это возможно.

1 ответ

Отказ от ответственности: это автор.

Вы можете запустить несколько pthread и запустить планировщик lthread в каждом из них (это делается автоматически с помощью вызова lthread_run() в функции pthread). Таким образом, каждый поток будет выполнять кучу потоков.

Другие вопросы по тегам