Очевидное «легковесное» решение состоит в том, чтобы избежать сложных вложенных вызовов, за исключением ограниченных ситуаций, когда время выполнения будет жестко ограничено, затем сохранить явную структуру состояний для каждого «потока» и реализовать логику основной программы как конечный автомат, которыйлегко приостановить / возобновить в большинстве точек.Затем вы можете просто поменять указатель на структуру состояний для «переключения контекста».По сути, этот метод сводится к сохранению всех важных переменных состояния, включая те, которые обычно являются локальными переменными, в структуре состояний.
То, стоит ли это, вероятно, зависит от причины, по которой вы избегаете pthreads.Если ваша причина заключается в переносимости на системы, отличные от POSIX, или если вам действительно нужен детерминированный поток программ, то это может быть целесообразно.Но если вы просто беспокоитесь о проблемах с производительностью и синхронизацией памяти, я думаю, вам следует использовать pthreads и управлять этими проблемами.Если вы избегаете ненужной блокировки, используете мелкозернистые блокировки и минимизируете время удержания блокировок, производительность не должна ухудшаться.
Редактировать: На основе ваших дальнейших подробностей, опубликованных в комментарияхпо основному вопросу, я думаю, что предложенное мной решение является правильным.Каждый актер должен иметь свой собственный контекст, в котором вы сохраняете состояние действия / мышления / т. Д. Актера.У вас будет функция run_actor
, которая будет принимать контекст актера, и несколько «тиков» для улучшения состояния актера, а также функция run_all_actors
, которая будет перебирать список активных актеров и вызывать run_actor
для каждогос указанным числом тактов.
Кроме того, обратите внимание, что это решение по-прежнему позволяет использовать реальные потоки, чтобы использовать преимущества SMP / многоядерных машин.Вы просто делите актеров между потоками.Вам может потребоваться некоторая степень блокировки, если одному действующему субъекту необходимо изучить контекст другого (например, для обнаружения столкновений).