Многоядерный и параллелизм - языки, библиотеки и [закрытые] методы разработки

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

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

35
задан Quonux 22 September 2013 в 12:52
поделиться

14 ответов

Я предложил бы два сдвига парадигмы:

программное обеспечение Транзакционная Память

можно хотеть смотреть на понятие программное обеспечение Транзакционная Память (STM). Идея состоит в том, чтобы использовать оптимистичный параллелизм : любая операция, которая работает параллельно другим, пытается завершить свое задание в изолированной транзакции; если в какой-то момент другая транзакция фиксировалась, который делает недействительным данные, над которыми работает эта транзакция, работа транзакции является throwed далеко и транзакцией, выполненной снова.

я думаю, что первая широко известная реализация идеи (если не подтверждение концепции и сначала одно) является той в Haskell: Бумаги и представления о транзакционной памяти в Haskell. Много других реализаций перечислены на Циклы событий и обещания статьи .

STM Википедии

, Другой совсем другой способ иметь дело с параллелизмом реализован в [E язык программирования] ( http://en.wikipedia.org/wiki/E_ (programming_language%29) .

Примечание, что его способ иметь дело с параллелизмом, а также другими частями дизайна языка, в большой степени основан на модели Actor.

11
ответ дан Nowhere man 27 November 2019 в 07:06
поделиться

C++ 0x обеспечит std::lock функции для блокировки больше чем одного взаимного исключения вместе. Это поможет облегчить мертвую блокировку из-за неисправной блокировки. Кроме того, C++ 0x библиотека потока будет иметь обещания, фьючерсы и упакованные задачи, которые позволяют потоку ожидать результата операции, выполненной на другом потоке без любых блокировок уровня пользователя.

2
ответ дан Anthony Williams 27 November 2019 в 07:06
поделиться

OpenMP.

Это обрабатывает потоки для Вас так, Вы только волнуетесь, о которых частях Вашего приложения C++ Вы хотите работать параллельно.

, например,

#pragma omp parallel for
for (int i=0; i < SIZE; i++) 
{
// do something with an element
}

вышеупомянутый код будет работать за циклом на стольких потоках, сколько Вы сказали openmp времени выполнения использовать, поэтому если РАЗМЕР равняется 100, и у Вас есть четырехъядерное поле, которое для цикла выполнит 25 объектов на каждом ядре.

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

2
ответ дан gbjbaanb 27 November 2019 в 07:06
поделиться
3
ответ дан Ben Hoffstein 27 November 2019 в 07:06
поделиться

Я сказал бы:

Модели: потоки + общее состояние, агенты + передача сообщений, транзакционная память, отображают/уменьшают? Языки: Erlang, Io, Scala, Clojure, Библиотеки Reia: Retlang, Jetlang, Kilim, Cilk ++, ветвление/соединение, MPI, Kamaelia, Терракота

я поддерживаю блог ссылки параллелизма о материале как это (Erlang, Scala, поточная обработка Java, модель агента, и т.д.) и поднимаю пару ссылок день:

http://concurrency.tumblr.com

4
ответ дан Alex Miller 27 November 2019 в 07:06
поделиться

Я знаю о Reia - язык, который основан на Erlang, но больше походит на Python/Ruby.

2
ответ дан Jonathan 27 November 2019 в 07:06
поделиться

Intel Стандартные блоки Поточной обработки для C++ выглядит очень интересным мне. Это предлагает намного более высокий уровень абстракции, чем необработанные потоки. O'Reilly имеет очень хорошая книга , если Вам нравится мертвая древовидная документация. Посмотрите, также, Какой-либо опыт с Intel’s, Распараллеливающим Стандартные блоки? .

4
ответ дан Community 27 November 2019 в 07:06
поделиться

Я использовал обработка для Python. Это имитирует API поточная обработка модуль и таким образом довольно просто в использовании.

, Если Вы, оказывается, используете map/imap или понимание генератора/списка, преобразовывая Ваш код для использования processing, просто:

def do_something(x):
    return x**(x*x)

results = [do_something(n) for n in range(10000)]

может быть параллелизирован с [1 118]

import processing
pool = processing.Pool(processing.cpuCount())
results = pool.map(do_something, range(10000))

, который будет использовать однако много процессоров, необходимо вычислить результаты. Существуют также ленив (Pool.imap) и асинхронные варианты (Pool.map_async).

существует класс очереди, который реализует Queue.Queue , и рабочие, которые подобны потокам.

Глюки

processing основаны fork(), который должен быть эмулирован в Windows. Объекты передаются через pickle / unpickle, таким образом, необходимо удостовериться, что это работает. Разветвление процесса, который получил ресурсы уже, не могло бы быть тем, что Вы хотите (думайте соединения с базой данных), но в целом оно работает. Это работает так хорошо, что это было добавлено к Python 2.6 на кратчайшем пути (cf. PEP-317).

6
ответ дан Torsten Marek 27 November 2019 в 07:06
поделиться

Вы упомянули Java, но Вы только упоминаете потоки. Вы посмотрели на параллельную библиотеку Java? Это прибывает связанное Java 5 и выше.

Это - очень хорошая библиотека, содержащая ThreadPools, CopyOnWriteCollections для именования очень немногих. Проверьте документацию в Учебное руководство по Java. Или если Вы предпочитаете, документы .

Java
9
ответ дан Steve K 27 November 2019 в 07:06
поделиться

Вопрос , Из какой модели параллельного программирования Вы рекомендуете сегодня использовать в своих интересах manycore процессоры завтра? был уже спрошен. Я дал следующий ответ там также.

Kamaelia платформа Python для того, чтобы создать приложения с большим количеством коммуникационных процессов.

Kamaelia - Параллелизм сделал полезным, забавным

В Kamaelia Вы системы сборки от [1 114] простые компоненты, которые говорят друг с другом . Эта разработка скоростей, в широком масштабе помогает обслуживанию и также означает Вас сборка естественно параллельное программное обеспечение . Это предназначается, чтобы быть доступным [1 116] любой разработчик, включая новичков. Это также делает его забавой:)

, Какой системы? Сетевые серверы, клиенты, настольные приложения, pygame базирующиеся игры, транскодируют системы и конвейеры, системы цифрового телевидения, спам eradicators, обучающие инструменты и изрядное количество больше:)

Вот является видео от Pycon 2009. Это запускается путем сравнения Kamaelia со Скрученным и Parallel Python и затем дает руки на демонстрацию Kamaelia.

Легкий Параллелизм с Kamaelia - Частью 1 (59:08)
Легкий Параллелизм с Kamaelia - Часть 2 (18:15)

4
ответ дан Glorfindel 27 November 2019 в 07:06
поделиться

Я занимаюсь параллельным программированием в Ada уже почти 20 лет.

Сам язык (не привязанный к библиотеке) поддерживает многопоточность («задачи»), несколько моделей планирования и несколько парадигм синхронизации. Вы даже можете создавать свои собственные схемы синхронизации, используя встроенные примитивы.

Вы можете думать о свидании Ады как о процедурно-ориентированном средстве синхронизации, в то время как защищенные объекты более объектно-ориентированы. Рандеву похожи на старую CS-концепцию мониторов , но гораздо более мощные. Защищенные объекты - это специальные типы с примитивами синхронизации, которые позволяют создавать такие вещи, как блокировки ОС, семафоры, события и т. Д. Однако, он достаточно мощный, чтобы вы также могли изобретать и создавать собственные типы объектов синхронизации в зависимости от ваших конкретных потребностей. .

4
ответ дан 27 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: