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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Я предложил бы два сдвига парадигмы:
можно хотеть смотреть на понятие программное обеспечение Транзакционная Память (STM). Идея состоит в том, чтобы использовать оптимистичный параллелизм : любая операция, которая работает параллельно другим, пытается завершить свое задание в изолированной транзакции; если в какой-то момент другая транзакция фиксировалась, который делает недействительным данные, над которыми работает эта транзакция, работа транзакции является throwed далеко и транзакцией, выполненной снова.
я думаю, что первая широко известная реализация идеи (если не подтверждение концепции и сначала одно) является той в Haskell: Бумаги и представления о транзакционной памяти в Haskell. Много других реализаций перечислены на Циклы событий и обещания статьи .
, Другой совсем другой способ иметь дело с параллелизмом реализован в [E язык программирования] ( http://en.wikipedia.org/wiki/E_ (programming_language%29) .
Примечание, что его способ иметь дело с параллелизмом, а также другими частями дизайна языка, в большой степени основан на модели Actor.
C++ 0x обеспечит std::lock
функции для блокировки больше чем одного взаимного исключения вместе. Это поможет облегчить мертвую блокировку из-за неисправной блокировки. Кроме того, C++ 0x библиотека потока будет иметь обещания, фьючерсы и упакованные задачи, которые позволяют потоку ожидать результата операции, выполненной на другом потоке без любых блокировок уровня пользователя.
Это обрабатывает потоки для Вас так, Вы только волнуетесь, о которых частях Вашего приложения C++ Вы хотите работать параллельно.
, например,
#pragma omp parallel for
for (int i=0; i < SIZE; i++)
{
// do something with an element
}
вышеупомянутый код будет работать за циклом на стольких потоках, сколько Вы сказали openmp времени выполнения использовать, поэтому если РАЗМЕР равняется 100, и у Вас есть четырехъядерное поле, которое для цикла выполнит 25 объектов на каждом ядре.
существует несколько других параллельных расширений для различных языков, но те, которыми я больше всего интересуюсь, являются теми, которые работают на Вашей видеокарте. Это - реальная параллельная обработка:) (примеры: GPU ++ и libSh)
Java имеет библиотеку агентов также, Вы знаете . И Вы знали, что Ава J является функциональным языком? ;)
Я пристально слежу за Параллельные Расширения для.NET и Параллельный LINQ.
Этот вопрос тесно связан с, если не дубликат, , Из какой модели параллельного программирования Вы рекомендуете сегодня использовать в своих интересах manycore процессоры завтра?
Я сказал бы:
Модели: потоки + общее состояние, агенты + передача сообщений, транзакционная память, отображают/уменьшают? Языки: Erlang, Io, Scala, Clojure, Библиотеки Reia: Retlang, Jetlang, Kilim, Cilk ++, ветвление/соединение, MPI, Kamaelia, Терракота
я поддерживаю блог ссылки параллелизма о материале как это (Erlang, Scala, поточная обработка Java, модель агента, и т.д.) и поднимаю пару ссылок день:
Я знаю о Reia - язык, который основан на Erlang, но больше походит на Python/Ruby.
Intel Стандартные блоки Поточной обработки для C++ выглядит очень интересным мне. Это предлагает намного более высокий уровень абстракции, чем необработанные потоки. O'Reilly имеет очень хорошая книга , если Вам нравится мертвая древовидная документация. Посмотрите, также, Какой-либо опыт с Intel’s, Распараллеливающим Стандартные блоки? .
Я использовал обработка для 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).
Вы упомянули Java, но Вы только упоминаете потоки. Вы посмотрели на параллельную библиотеку Java? Это прибывает связанное Java 5 и выше.
Это - очень хорошая библиотека, содержащая ThreadPools, CopyOnWriteCollections для именования очень немногих. Проверьте документацию в Учебное руководство по Java. Или если Вы предпочитаете, документы .
JavaНекоторый основанный на Scala материал:
Вопрос , Из какой модели параллельного программирования Вы рекомендуете сегодня использовать в своих интересах manycore процессоры завтра? был уже спрошен. Я дал следующий ответ там также.
Kamaelia платформа Python для того, чтобы создать приложения с большим количеством коммуникационных процессов.
Вот является видео от Pycon 2009. Это запускается путем сравнения Kamaelia со Скрученным и Parallel Python и затем дает руки на демонстрацию Kamaelia.Kamaelia - Параллелизм сделал полезным, забавным
В Kamaelia Вы системы сборки от [1 114] простые компоненты, которые говорят друг с другом . Эта разработка скоростей, в широком масштабе помогает обслуживанию и также означает Вас сборка естественно параллельное программное обеспечение . Это предназначается, чтобы быть доступным [1 116] любой разработчик, включая новичков. Это также делает его забавой:)
, Какой системы? Сетевые серверы, клиенты, настольные приложения, pygame базирующиеся игры, транскодируют системы и конвейеры, системы цифрового телевидения, спам eradicators, обучающие инструменты и изрядное количество больше:)
Легкий Параллелизм с Kamaelia - Частью 1 (59:08)
Легкий Параллелизм с Kamaelia - Часть 2 (18:15)
Я занимаюсь параллельным программированием в Ada уже почти 20 лет.
Сам язык (не привязанный к библиотеке) поддерживает многопоточность («задачи»), несколько моделей планирования и несколько парадигм синхронизации. Вы даже можете создавать свои собственные схемы синхронизации, используя встроенные примитивы.
Вы можете думать о свидании Ады как о процедурно-ориентированном средстве синхронизации, в то время как защищенные объекты более объектно-ориентированы. Рандеву похожи на старую CS-концепцию мониторов , но гораздо более мощные. Защищенные объекты - это специальные типы с примитивами синхронизации, которые позволяют создавать такие вещи, как блокировки ОС, семафоры, события и т. Д. Однако, он достаточно мощный, чтобы вы также могли изобретать и создавать собственные типы объектов синхронизации в зависимости от ваших конкретных потребностей. .