Потокобезопасность в C? - PullRequest
0 голосов
/ 25 января 2011

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

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

Спасибо!

Ответы [ 4 ]

2 голосов
/ 25 января 2011

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

1 голос
/ 25 января 2011

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

Хороший пример его использования - использование Linked List .Вы не можете позволить двум различным потокам изменять его одновременно.В вашем примере вы могли бы использовать связанный список для создания очереди, и каждый поток потреблял бы из нее некоторые данные.

Очевидно, что есть другие механизмы синхронизации, но этот (безусловно?)наиболее важный.

Вы могли бы взглянуть на эту страницу (и ссылки на страницы внизу) для получения дополнительной информации о реализации.

0 голосов
/ 25 января 2011

Безопасность потока достигается за счет использования любых примитивов синхронизации, которые обеспечивает реализация многопоточности.

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

Оттуда возможны различные варианты оптимизации:

  • Кэширование указателя на последнее событие, поэтому добавление события в список становится дешевле.
  • Добавление механизма уведомления, чтобы рабочие потоки могли спать, пока список пуст.Как правило, это достигается с помощью так называемой условной переменной 1011 *.
  • Использование нескольких списков, поэтому, если первый список заблокирован, работник может извлечь событие из другого списка, не дожидаясьпоток, который в данный момент заблокировал список.
0 голосов
/ 25 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...