Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про JavaScript: thread safety, lock, mutex, atomic operations, race condition

Как сделать обработку сигнала потокобезопасной (например, через Lock или атомарные операции)?

Вопрос проверяет понимание механизмов синхронизации доступа к разделяемым данным в многопоточных приложениях.

Короткий ответ

Потокобезопасность достигается с помощью блокировок (Lock, Mutex) или атомарных операций. Блокировки защищают критические секции, гарантируя, что только один поток выполняет код. Атомарные операции выполняются неделимо, что исключает состояние гонки. Выбор зависит от сложности операции: для простых инкрементов подходят атомарные типы, для сложных действий — блокировки.

Длинный ответ

Основы потокобезопасности

Когда несколько потоков одновременно обращаются к общим данным, может возникнуть состояние гонки (race condition). Чтобы этого избежать, используют механизмы синхронизации. Два основных подхода — блокировки (Lock, Mutex) и атомарные операции.

Блокировки (Lock/Mutex)

Блокировка гарантирует, что только один поток может выполнять защищённый участок кода в данный момент. Другие потоки ожидают освобождения блокировки. Это простой и надёжный способ, но может привести к снижению производительности из-за ожидания.

import threading

counter = 0
lock = threading.Lock()

def increment():
    global counter
    for _ in range(1000):
        with lock:
            counter += 1

threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(counter)  # 10000

Атомарные операции

Атомарные операции выполняются как единое неделимое действие. Они быстрее блокировок, так как не требуют переключения контекста. Подходят для простых операций, таких как инкремент или сравнение с обменом (CAS).

import threading
import atomic

counter = atomic.AtomicInteger(0)

def increment():
    for _ in range(1000):
        counter.inc()

threads = [threading.Thread(target=increment) for _ in range(10)]
for t in threads: t.start()
for t in threads: t.join()
print(counter.get())  # 10000

Вывод

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

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#thread safety

#lock

#mutex

#atomic operations

#race condition

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.