Как я могу реализовать совместную легкую многопоточность с C на Mac OS X? - PullRequest
4 голосов
/ 29 августа 2010

Я пытаюсь найти облегченное решение для совместной работы с потоками, чтобы попытаться реализовать модель актера.Насколько я знаю, единственное решение - это setcontext / getcontext, но Apple не одобряет эту функциональность (?).Я смущен тем, почему они сделали это;однако я нахожу замену этому.

  • Pthreads не вариант, потому что мне нужна кооперативная модель вместо упреждающей модели для точного / ручного управления временем переключения контекста без дорогостоящей блокировки.*

    - edit -

    Причина избегания pthreads: потому что pthread не являются кооперативными / детерминированными и слишком дорогими.Мне нужна модель актера для игрового логического кода, поэтому тысячи контекста исполнения требуются как минимум.Аппаратные потоки требуют МБ памяти и затрат на создание / уничтожение.И параллелизм не важен.На самом деле мне просто нужно одновременное выполнение многих функций.Это может быть реализовано с помощью множества разделенных функций и некоторой объектной модели, но моя цель - уменьшить эти накладные расходы.

    Если я знаю что-то не так, пожалуйста, исправьте меня.Это будет очень цениться.

Ответы [ 3 ]

3 голосов
/ 29 августа 2010

Очевидное «легковесное» решение состоит в том, чтобы избежать сложных вложенных вызовов, за исключением ограниченных ситуаций, когда время выполнения будет жестко ограничено, затем сохранить явную структуру состояний для каждого «потока» и реализовать логику основной программы как конечный автомат, которыйлегко приостановить / возобновить в большинстве точек.Затем вы можете просто поменять указатель на структуру состояний для «переключения контекста».По сути, этот метод сводится к сохранению всех важных переменных состояния, включая те, которые обычно являются локальными переменными, в структуре состояний.

То, стоит ли это, вероятно, зависит от причины, по которой вы избегаете pthreads.Если ваша причина заключается в переносимости на системы, отличные от POSIX, или если вам действительно нужен детерминированный поток программ, то это может быть целесообразно.Но если вы просто беспокоитесь о проблемах с производительностью и синхронизацией памяти, я думаю, вам следует использовать pthreads и управлять этими проблемами.Если вы избегаете ненужной блокировки, используете мелкозернистые блокировки и минимизируете время удержания блокировок, производительность не должна ухудшаться.

Редактировать: На основе ваших дальнейших подробностей, опубликованных в комментарияхпо основному вопросу, я думаю, что предложенное мной решение является правильным.Каждый актер должен иметь свой собственный контекст, в котором вы сохраняете состояние действия / мышления / т. Д. Актера.У вас будет функция run_actor, которая будет принимать контекст актера, и несколько «тиков» для улучшения состояния актера, а также функция run_all_actors, которая будет перебирать список активных актеров и вызывать run_actor для каждогос указанным числом тактов.

Кроме того, обратите внимание, что это решение по-прежнему позволяет использовать реальные потоки, чтобы использовать преимущества SMP / многоядерных машин.Вы просто делите актеров между потоками.Вам может потребоваться некоторая степень блокировки, если одному действующему субъекту необходимо изучить контекст другого (например, для обнаружения столкновений).

1 голос
/ 05 декабря 2010

Я тоже исследовал этот вопрос и наткнулся на GNU Pth (не путать с Pthreads). Смотри http://www.gnu.org/software/pth/

Это стремится быть портативным решением для кооперативных потоков. В нем упоминается, что он реализован через setcontext / getcontext, если он доступен (поэтому он может отсутствовать в Mac OSX). В противном случае он говорит, что использует longjmp / setjmp, но мне не ясно, как это работает.

Надеюсь, что это полезно для всех, кто ищет этот вопрос.

0 голосов
/ 12 сентября 2011

Я обнаружил, что некоторые необходимые функции из setcontext/getcontext реализованы в libunwind.

К сожалению, библиотека не будет скомпилирована в Mac OS X из-за устареванияsetcontext/getcontext.В любом случае Apple реализовала свою собственную libunwind, которая совместима с реализацией GNU на уровне источника.Библиотека существует в Mac OS X 10.6, 10.7 и iOS.(Я не знаю точную версию для iOS)

Эта библиотека не документирована, но я мог найти заголовки из этих мест.

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/libunwind.h
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/include/libunwind.h
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.0.sdk/usr/include/libunwind.h
/Developer/SDKs/MacOSX10.6.sdk/usr/include/libunwind.h
/Developer/SDKs/MacOSX10.7.sdk/usr/include/libunwind.h

В примечании былозаголовочный файл, по которому нужно перейти на GNU libunwind сайт для документации.

Ставлю на библиотеку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...