Nano Hash - криптовалюты, майнинг, программирование

C socket API потокобезопасен?

Я использую API сокетов как для Linux, так и для Win32. В моей программе несколько потоков имеют общий дескриптор сокета. В частности, несколько потоков вызывают send с указателем общего сокета (т. Е. С одним и тем же портом). В этом случае нужно ли устанавливать блокировку для обеспечения безопасности потоков? Я не смог найти ответа. Я могу сделать тест, но хочу услышать ваш опыт.

ИЗМЕНИТЬ: я знаю, что такая отправка данных через сокет вообще не является атомарной операцией. Определенно мы должны использовать мьютекс для обеспечения безопасности потоков. Однако мне было интересно, может ли системный API иметь собственную внутреннюю блокировку. В таком случае мы можем не устанавливать собственную блокировку.

Этот вопрос может быть применим и к функции fprintf. Мне интересно, что такие системные API-интерфейсы будут иметь свои собственные блокировки. По моему опыту, вызов fprintf из нескольких потоков не уничтожил мою программу, хотя были скачки в файле или стандартном выводе (т. Е. Непоследовательные или непредсказуемые результаты, но программа не аварийно завершилась), что подразумевает, что fprintf имеет блокировку для защиты своих внутренних структура данных.


  • На мой взгляд, де-факто проблема дизайна - это чтение и запись нескольких потоков в один и тот же сокет. 12.02.2018

Ответы:


1

Сокеты не являются частью стандарта C ++, поэтому это зависит от реализации. Как правило, они не являются потокобезопасными, поскольку send не является атомарной операцией. Проверьте это обсуждение, Дополнительная информация.

РЕДАКТИРОВАТЬ: ОС могла иметь или не могла иметь внутреннюю блокировку для защиты внутренних структур. Это зависит от реализации. Так что рассчитывать на это не стоит.

01.03.2010
  • Похоже, что POSIX send / recv является потокобезопасным на основе вашей ссылки и этого обсуждения: stackoverflow.com/a/1981439/602245 10.02.2013
  • Если один поток выполняет операцию send, а другой - операцию read, будут ли эти два потока безопасными? 12.07.2021

  • 2

    Я считаю, что вызовы файлового дескриптора close () для нескольких сокетов чрезвычайно опасны в параллельной среде.

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

    10.09.2013

    3

    Отправка данных через сокет не является атомарной транзакцией - любая неатомарная транзакция потребует блокировки / синхронизации. Это не зависит от платформы.

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

  • 4

    Нет, переменная, созданная с помощью accept, не обязательно должна быть мьютексом. Любые данные, используемые потоками, должны быть как минимум семафорами.

    sem_t* sem_data;
    
    23.08.2012
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..