Портативный потокобезопасность в C? - PullRequest
3 голосов
/ 02 августа 2009

Назначение

Я пишу небольшую библиотеку, для которой переносимость является самой большой проблемой. Он был спроектирован так, чтобы предполагать, что он в основном соответствует среде C90 (ISO / IEC 9899: 1990) ... и ничего более. Набор функций, предоставляемых библиотекой, работает (чтение / запись) на внутренней структуре данных. Я рассмотрел некоторые другие варианты дизайна, но больше ничего не представляется возможным для того, что библиотека пытается достичь .

Вопрос

Существуют ли переносимые алгоритмы, методы или заклинания, которые можно использовать для обеспечения безопасности потоков? Я не заинтересован в том, чтобы сделать функции повторными. Более того, меня не волнует скорость или (возможно) потеря ресурсов, если алгоритм / техника / заклинание является переносимым. В идеале я не хочу зависеть от каких-либо библиотек (например, GNU Pth) или от системных операций (например, атомарного тестирования и установки).

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

Любая помощь очень ценится.

Ответы [ 4 ]

1 голос
/ 02 августа 2009

В наши дни почти все системы (даже Windows) могут запускать libpthread.

1 голос
/ 02 августа 2009

Без поддержки ОС / оборудования, по крайней мере, атомарного CAS, вы ничего не сможете сделать, это практично. Однако - это переносимые библиотеки, которые абстрагируют различные платформы в единый интерфейс.

http://www.gnu.org/software/pth/related.html

0 голосов
/ 02 августа 2009

Алгоритм пекарни Лампорта, вероятно, будет работать; к сожалению, с этим все еще есть практические проблемы. В частности, многие процессоры реализуют операции с памятью не по порядку : даже если вы скомпилировали свой код в совершенно правильную последовательность команд, центральный процессор при выполнении вашего кода может принять решение изменить порядок команд на летать, чтобы добиться лучшей производительности. Единственный способ обойти это - использовать барьеры памяти , которые сильно зависят от системы и процессора.

У вас действительно есть только два варианта: либо (1) сделать вашу библиотеку небезопасной для потока и информировать пользователей об этом в документации, либо (2) использовать специфический для платформы мьютекс. Вариант 2 может быть упрощен с помощью другой библиотеки, которая реализует мьютексы для большого разнообразия платформ и предоставляет вам унифицированный абстрактный интерфейс.

0 голосов
/ 02 августа 2009

Функции либо не могут быть поточно-ориентированными, либо являются поточно-ориентированными, в зависимости от того, как вы хотите на них смотреть И многопоточность / блокировка изначально зависит от платформы. На самом деле, до 1001 * пользователей вашей библиотеки могут решить проблемы с потоками.

...