Вопрос

Цель

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

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

Сегодня почти все системы (даже Windows) могут использовать libpthread.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top