2009-07-07 3 views
1

Большая часть многопоточной работы, которую я выполнил, была в C/C++, Python или Delphi (Object Pascal). Все в Windows. Я буду использовать Delphi для обсуждения здесь. В Delphi есть класс класса TThread, который абстрагирует процесс создания потоков. Класс предоставляет метод Execute, который является функцией потока созданного потока. Вы переопределяете этот метод и обычно создаете цикл внутри него, который завершается, когда поток завершается. Вы выполняете работу потока внутри цикла.Кто-нибудь видел язык программирования, который обрабатывает такие потоки?

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

Мне было интересно, если кто-нибудь видел язык программирования, который делает это проще? Вот что я хотел бы назвать идиомой программирования. Давайте возьмем подкласс класса Delphi TThread, созданный для этого обсуждения. Предположим, что я могу отмечать методы класса одним из трех ключевых слов: Private, PublicExecuteInAnyContext или PublicExecuteInPrivateContext. Вот как они будут работать.

Закрыто: частные методы выполнялись только в контексте потока. Компилятор автоматически добавит код, который приведет к возникновению исключения, если путь кода привел к тому, что этот метод выполняется в контексте вне хост-потока. (Например, «Ошибка, попытка выполнить метод private для потока $ AEB из потока $ EE0»).

PublicExecuteInAnyContext: методы, помеченные как таковые, могут быть вызваны потоком, которому принадлежит метод и любой внешний поток. Любые объекты данных, на которые ссылаются эти методы, автоматически будут защищены объектами синхронизации, с возможностью переопределить выбор по умолчанию и предоставить свои собственные. (Mutex или семафор вместо критического раздела и т. Д.)

PublicExecuteInPrivateContext: методы, помеченные этим ключевым словом, будут выполняться в контексте потока, но могут быть вызваны любым потоком. Эта опция позволяет использовать две стратегии для обработки вызовов таких методов внешними потоками:

1) Режим 1 - Блокировать вызывающий поток: вызывающий поток блокируется до тех пор, пока метод не будет возвращен. Другими словами, компилятор автоматически записывал код, чтобы блокировать вызывающий поток. Любые параметры, переданные вызывающим потоком, будут скопированы в переменные, приватные для потока хоста. Метод не будет выполняться до тех пор, пока хост-поток не получит управление. Когда хост-поток вышел из метода, вызывающий поток будет освобожден и будет иметь какие-либо результаты, возвращаемые методом, скопированным в его собственное личное пространство переменных.

2) Режим 2 - Не блокируйте вызывающий поток: это позволит добавить дополнительный аргумент функции обратного вызова. Любые параметры, переданные методу внешним потоком, будут скопированы в личное пространство переменной потока. Компилятор снова проведет выполнение метода до тех пор, пока хост-поток не получит управление, но позволит вызывающему потоку продолжить работу без блокировки. Когда хост-поток завершил выполнение метода, если была указана функция обратного вызова, она вызывала бы эту функцию **, но в контексте исходного потока, который вызывал этот метод, а не в контексте потока хоста **.

Язык, который обеспечивал бы такую ​​автоматическую обработку потоков, по крайней мере для меня был бы намного интереснее делать многопоточность с тем, как я должен это делать сейчас. Кто-нибудь видел язык программирования или модуль/взлом для одного из основных языков, который предоставляет такую ​​модель многопоточности?

ответ

3

Я не думаю, что это точно соответствует вашему описанию, но Erlang предоставляет одну из самых простых моделей параллелизма, которые я видел. Он использует подход «ничего общего», который может или не может звучать привлекательно для вас, но я нашел его действительно интересным. Также очень легко создавать распределенные системы с ним, если вам когда-либо понадобится. Отъезд "Getting Started with Erlang", это отличный учебник, который охватывает почти все части языка.

+1

Да, читать документы. Играйте с Эрланг. Он разработан вокруг создания простых в использовании, легких, процессов с небольшим объемом памяти. http://erlang.org/doc/reference_manual/processes.html – marcc

0

Требуется упомянуть. LabVIEW действительно делает запуск с многопоточным потоком. Я просто нашел статью в интернете, которая на самом деле объясняет это в лучшем виде:

Если вы программировали в традиционных, текстологии языке раньше, парадигмы данных потока Labview может быть довольно трудно обнимаются. Парадигма потока данных предусматривает, что не важно, где на поверхности 2D блок-диаграммой а конкретный компонент размещается в отношению к другим компонентам, но то, что другие компоненты он подключен к. A конкретный компонентный узел не выполняет , пока все его входы не имеют ; однако он выполняет, как , так как все его входы доступны, независимо от того, что еще может быть , выполняемое в то же время, то есть параллельно с потенциально многими прочего.

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

http://saberrobotics.org/?id=34 Взятые из

Смежные вопросы