Подтвердить что ты не робот

Что такое "Hello World" для одновременных программ?

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

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

Я знаю о "Обеденная философия" , и это было бы приемлемо, но мне интересно, есть ли более убедительные, но одинаково простые проблемы.

4b9b3361

Ответ 1

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

Это хороший пример для экспозиции, потому что:

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

Чтобы продемонстрировать свою библиотеку concurrency, возможно, вы можете запустить поток с миллионами транзакций в подобном сценарии и продемонстрировать, как другие потоки все еще могут видеть согласованное представление о мире и т.д.

Ответ 3

Я не думаю, что есть стандартная первая программа для демонстрации того, что работает concurrency, например, "Hello world" для последовательных программ.

Более типичными для concurrency являются программы, которые демонстрируют проблемы, например параллельные счетчики, которые теряют некоторые счета без надлежащей синхронизации. Или случайные переводы между банковскими счетами, которые вызывают блокировку, если блокировка выполняется наивно. (Я сделал это при игре с Java concurrency.)

Одна вещь, демонстрирующая concurrency и относительно простая, заключается в совместном учете: параллельные потоки (или что-то еще) имеют внутренний счетчик, который они отправляют друг другу, и устанавливают, что они получают плюс один. (Я сделал это с тремя LEGO Mindstorms RCX через инфракрасный порт несколько лет назад, работал красиво.)

BTW: "Привет мир" встроенного программиста - мигающий светодиод.

Ответ 4

Раньше был пример Java-апплета (возможно, все еще есть), который вы использовали для проверки того, какой алгоритм планирования использует JVM и базовая ОС. Это анимированные два (или необязательно больше? Не помню) баров, постепенно заполняющихся, каждый анимированный другим потоком с одинаковым приоритетом.

Эквивалент, который печатает:

red 1
red 2
green 1
red 3
green 2

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

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

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

Ответ 5

Вы можете трассировать трассировку "Hello" и "World" в отдельных потоках. Или оживить "Привет", в то время как "Мир" - это трассировка лучей.