www.fgks.org   »   [go: up one dir, main page]

Как стать автором
Обновить

Как правильно тестировать конкурентные структуры данных

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров5K

Есть потрясающая библиотека Rust под названием loom, которую можно использовать для тщательного тестирования неблокируемых (lock-free) структур данных. Я давно хотел разобраться, как она работает. И сейчас хочу! Но недавно я случайно реализовал небольшой эксперимент, который, как мне кажется, содержит часть идей loom, поэтому о нём стоит написать. Моя цель — не научить вас тому, что нужно использовать на практике (если вы хотите этого, то почитайте документацию loom), а, скорее, вывести пару идей из фундаментальных принципов.
Читать дальше →
Всего голосов 32: ↑32 и ↓0+43
Комментарии3

What's all this fuss about Erlang?

Время на прочтение5 мин
Количество просмотров5.8K
by Joe Armstrong

Никто не в состоянии предсказывать будущее — но я сделаю несколько обоснованных предположений.

Предположим, что Intel правы, что их проект Keifer выстрелит. Если это случится, то 32-х ядерные процессоры появятся на рынке не позже 2009-2010.

Ничего удивительного здесь нет. Sun уже продает восьмиядерные Niagara с 4-мя «hyperthreads» на каждом ядре, что эквивалентно 32-ум ядрам.

Это разработка, которая осчастливит программистов на Erlang. Они 20 лет ждали этого события, и теперь настало время расплаты.

Хорошие новости для Erlang-программистов:

На N-ядерном процессоре ваша программа будет работать в N раз быстрее.

Читать дальше →
Всего голосов 77: ↑73 и ↓4+69
Комментарии271

Что такое транзакционная память и чем она полезна

Время на прочтение2 мин
Количество просмотров6K
По мере того, как многоядерные процессоры получают все большее и большее распространение, умение писать программы, использующие все доступные процессоры становится все более и более важным. Давайте рассмотрим то, почему существующие широко используемые средства написания программ для многоядерных процессоров не достаточно хорошее решение, что такое транзакционная память, и как она решает указанную проблему.
Читать дальше →
Всего голосов 44: ↑41 и ↓3+38
Комментарии21

java.util.concurrent. Часть первая: Зачем и почему?

Время на прочтение4 мин
Количество просмотров29K
Часть первая, в которой множеством слов раскрывается смысл существования этого API
Эта статья, хоть и не является прямым переводом, основана на статье Брайана Гетца Concurrency in JDK 5.0

Читать дальше →
Всего голосов 49: ↑39 и ↓10+29
Комментарии29

Новый синхронизатор Phaser

Время на прочтение5 мин
Количество просмотров56K
Phaser (Этапщик) — мощная и гибкая реализация паттерна синхронизации Барьер. Включен в JDK 7 в составе пакета java.util.concurrent.

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

Читать дальше →
Всего голосов 38: ↑37 и ↓1+36
Комментарии4

Конкурентность в асинхронном приложении на примере twisted

Время на прочтение4 мин
Количество просмотров3.9K
Теоретически, проблема конкурентного доступа не характерна для асинхронных приложений. В отличие от приложений с параллельной архитектурой, в которых в каждый момент времени может выполняться несколько задач претендующих на какой то общий ресурс — в асинхронном приложении в один момент времени выполняется только одна активность.

Но на практике все выглядит немного по иному:
Читать дальше →
Всего голосов 31: ↑27 и ↓4+23
Комментарии18

Java. Остановись задача

Время на прочтение2 мин
Количество просмотров94K
Вот уже почти год как усиленно занимаюсь коддингом на Java. Столкнулся с довольно серьезной на мой взгляд проблемой, связанных с многопоточностью, как мне кажется, неразрешимой в рамках текущей реализации JVM от Oracle (сказанное относится к JDK 1.5 и выше). Дело в том, что на данный момент в Java нет возможности гарантированно безопасно остановить выполнение какого-либо потока. Данный пост разъясняет почему это именно так и предлагает начать дискуссию о способах решения этой проблемы.
Читать дальше →
Всего голосов 58: ↑41 и ↓17+24
Комментарии29

Летняя школа Microsoft Research по параллельным вычислениям открывает регистрацию участников

Время на прочтение2 мин
Количество просмотров5.1K
Во время летних каникул исследовательское подразделение компании Microsoft – Microsoft Research проводит ежегодное крупнейшее мероприятие, ориентированное на аспирантов, студентов старших курсов и молодых ученых – Летнюю Школу. В этом году школа будет проходить в Санкт-Петербурге в сотрудничестве с НИУ ИТМО с 22 по 29 августа 2012 года.



Цель школы
  • Предоставить студентам из ведущих вузов страны уникальную возможность узнать о новейших достижениях в области параллельных вычислений.
  • Предоставить уникальные условия для обмена опытом между студентами и преподавателями в течение недели интенсивных занятий под руководством ведущих международных экспертов в области вычислительных наук.

Тематика школы: параллельные вычисления (Concurrency and Parallelism in Software).
Читать дальше →
Всего голосов 23: ↑17 и ↓6+11
Комментарии3

Пишем кеш с определенным временем хранения объектов с использованием java.util.concurrent

Время на прочтение4 мин
Количество просмотров21K
Не так давно, мне выпала задача, написать кеш, который сам себя чистит по истечению некоторого определенного времени. Требования к нему были следующие:
  1. Легковесность
  2. Потокобезобасность

В общем-то и все. До написания данной задачи с java.util.concurrent дела не имел. На мысль использования этого пакета меня натолкнул один мой коллега, у которого было нечто подобное, но не соответствовало тому функционалу который был нужен. Итак, начнем:

В качестве ключа будет выступать внутренний класс, который помимо прямого назначения будет определять он является «живым» или его можно удалить с кеша, так как время его существования подошло к концу:
Читать дальше →
Всего голосов 29: ↑25 и ↓4+21
Комментарии24

Вы все еще пишете многопоточку на C++ с ошибками синхронизации?

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров25K
Привет, коллеги! В этой статье я покажу свой подход к написанию многопоточного кода, который помогает избежать типовых ошибок, связанных с использованием базовых примитивов синхронизации.

Демонстрация идеи будет проходить на живых примерах кода на современном C++. Большинство описанных решений я применял сначала на собственных проектах, а теперь часть этих подходов уже используется в нашей собственной микроядерной операционной системе «Лаборатории Касперского» (KasperskyOS).

Сразу хочу оговориться, что тема многопоточности — очень большая и серьезная. И эта статья — не полноценный анализ проблем многопоточки, а только частНЫе (но довольно частЫе) кейсы, когда мы вынуждены использовать мьютексы.
Читать дальше →
Всего голосов 53: ↑47 и ↓6+57
Комментарии148

Как мы начали использовать виртуальные потоки Java 21 и на раз-два получили дедлок в TPC-C для PostgreSQL

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров21K

В этом посте мы расскажем о примере дедлока в TPC-C для PostgreSQL, причиной которого является исключительно переход на виртуальные потоки Java 21 - и никаких проблем обедающих философов.

Читать далее
Всего голосов 17: ↑16 и ↓1+19
Комментарии31

Что можно и что нельзя делать с Async/Await

Время на прочтение3 мин
Количество просмотров17K

Синтаксис async/await, введенный в Swift 5.5, значительно упростил асинхронное программирование, сделав его более доступным и интуитивно понятным. Однако, как и любой мощный инструмент, он может быть использован неправильно. Здесь я хочу рассмотреть пять распространенных ошибок, которые разработчики часто допускают при использовании async/await и предложить стратегии их избегания.

Ошибка 1: Необработка Ошибок

Асинхронные функции Swift могут вызывать ошибки, так же как и их синхронные аналоги. Однако многие разработчики, особенно те, кто только начинает работать с синтаксисом async/await, могут упускать обработку ошибок, что приводит к сбоям или непредсказуемому поведению.

Решение

Синтаксис do-catch в Swift - ключ к обработке ошибок из асинхронных функций. Обернув вызов асинхронной функции в блок do-catch, вы можете перехватить и обработать любые выброшенные ошибки, предотвратив сбои и обеспечивая предсказуемое поведение вашего приложения.

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Комментарии0

await vs yield на примере Effection 3.0 и React

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров7K

18 декабря 2023 года вышел релиз Effection 3.0 - типизированная альтернативна async/await на генераторах (Structured Concurrency and Effects for JavaScript).

В статье сравним подходы на генераторах и async/await и расскажу как использовать Effection в React для решения типичных проблем с асинхронным кодом:

- Race condition

- AbortController

- Clean up

- Debounce

Читать далее
Всего голосов 17: ↑17 и ↓0+20
Комментарии33

Как не нужно фиксить concurrency проблемы

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров10K

Согласитесь, сoncurrency — одна из непростых тем программирования. В начале своей карьеры программиста кто‑то всячески пытается избежать погружения в эту тему, но рано или поздно приходится столкнуться с concurrency проблемами. Это может случиться, потому что нужно написать потокобезопасный код или прилетел баг на уже имеющийся код.

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

Статья не про серебряную пулю, как исправить concurrency проблемы, а про костыльные подходы веселых и находчивых, которые не решают суть проблемы.

Читать далее
Всего голосов 16: ↑10 и ↓6+9
Комментарии123

Стоит ли бояться serializable-транзакций больше, чем труднонаходимых багов?

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров4.9K

В базах данных транзакции обладают свойствами ACID, где «I» означает изоляцию транзакций при одновременном (concurrent) выполнении.

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

Сериализация выполнения транзакций не бесплатна с точки зрения производительности.

Многие СУБД поддерживают более слабые уровни изоляции, оставляя за разработчиком выбор подходящего. В монолитных СУБД более слабый уровень изоляции часто используется по умолчанию. Так, в PostgreSQL и MySQL это «read committed». В распределённых СУБД чаще по умолчанию более строгие уровни: «repeatable read» в YugabyteDB и TiDB, «serializable» в CockroachDB и YDB.

Слабые уровни изоляции могут быть причиной очень труднонаходимых багов. Причём эти баги могут вызвать уязвимости в безопасности.

Из-за подобных багов уже были украдены миллионы долларов, в частности с биткоин-бирж. Мы расскажем о подобных случаях более детально в следующих разделах.

Читать далее
Всего голосов 16: ↑15 и ↓1+16
Комментарии38

Deadlock Empire — игра для разработчиков

Время на прочтение2 мин
Количество просмотров15K

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

Встречайте: Deadlock Empire!

Суть игры — управление планировкой потоков, код которых приведен в заданиях. Управлять нужно так, чтобы добиться ошибочной ситуации: взаимблокировки, повторных значений счетчиков, достижения определенных участков кода и прочих непредвиденных ситуаций, которые нужно осознавать при разработке многопоточных приложений.
Читать дальше →
Всего голосов 24: ↑24 и ↓0+24
Комментарии5

CLRium #6: Concurrency & Parallelism. Обучение магии распараллеливания задач

Время на прочтение3 мин
Количество просмотров7.7K

Наша команда по-настоящему взбудоражена: ведь мы находимся в стадии производства сложнейшего для нас семинара среди всех нами созданных: семинара по многопоточке, конкурентности и прочим смежным вопросам. Мы немного боимся: мы создали целый огромный процесс внутренних согласований докладов, источников информации, вычитываем, сверяем… исправляем… и всё это для того чтобы создать его полезным для каждого уровня подготовки.


Наша задача звучит очень просто: за два полных дня научить вас всем слоям многопоточки.


Открыть программу
Всего голосов 24: ↑23 и ↓1+22
Комментарии2

Как не ошибиться с конкурентностью в Go

Время на прочтение12 мин
Количество просмотров33K

Почему мы вообще хотим писать конкурентный код? Потому что процессоры перестали расти по герцовке и начали расти по ядрам. С каждым годом увеличивается количество ядер процессора, и мы хотим их эффективно утилизировать. Go — тот язык, который создан для этого. В документации так и написано.


Мы берём Go, начинаем писать конкурентный код. Конечно, ожидаем, что легко сможем обуздать мощь каждого ядра нашего процессора. Так ли это?


Меня зовут Артемий. Этот пост — вольная расшифровка моего доклада с GopherCon Russia. Он появился как попытка дать толчок людям, которые хотят разобраться, как писать хороший, конкурентный код.



Видео с конференции GopherCon Russia

Всего голосов 62: ↑58 и ↓4+54
Комментарии16

Актуальна ли книга «Java Concurrency in Practice» во времена Java 8 и 11?

Время на прочтение5 мин
Количество просмотров39K
Здравствуйте, коллеги!

Статья, перевод которой мы предлагаем сегодня, в очередной раз напоминает о важности нестареющей книги "Java Concurrency in practice" под авторством Брайана Гёца (Brian Goetz).


Даты комментариев к этой статье в оригинале подсказывают, что автор обновляет и заново публикует ее не в первый раз. Поэтому мы позволили себе также обновить ссылку на упоминаемую в статье книгу Рауля-Габриэля Урма, Марио Фуско и Алана Майкрофта, которая выходила в издательстве «Manning» под названием «Java 8 in Action». У нас готовится перевод нового издания под названием «Modern Java». Но пока давайте поговорим о классике. Вы приглашаетесь под кат.
Читать дальше →
Всего голосов 15: ↑13 и ↓2+11
Комментарии5
1
23 ...