URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8839
[ Назад ]

Исходное сообщение
"Синхронизация 2 потоков"

Отправлено d1987 , 30-Авг-10 19:47 
Помогите пожалуйста разобраться.

Пытаюсь увеличить производительность программы.
Есть 2 потока, оба работают с одним объектом, код не сильно сложный - получить объект или вернуть объект. Синхронизация выполнена на mutex. Приложение написано на С и работает на железке c PowerPC e500v2 под Linux. И важно, чтобы оно работало как можно быстрее.

Хотелось бы спросить у знающих людей, так как вроде мьютексы довольно тяжежеловесны, возможно ли увеличить производительность за счёт использования другого механизма синхронизации, сейчас планирую почитать про них, но времени не так много - spinlock, semaphore, condition variable, RCU (liburcu) или использовании неких других примитивов - видел в каком-то коде функцию __sync_fetch_and_add для синхронизации и что-то ещё наверняка есть. Просто я под Linux не писал ничего, только планирую изучать данную платформу, но на работе есть апликация одна и сейчас её решили улучшить.  


Содержание

Сообщения в этом обсуждении
"атомарные синхронизации"
Отправлено Вова , 31-Авг-10 10:23 
Если критическая секция кода, оборачиваемая мутексом, действительно несложна, то есть  пара инкрементов/присвоение указателей/итп, то использование __sync* функций http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html будет оптимальным.  В теории, в такой ситуации подойдёт спинлок, но фактически выигрышей от спинлока не наблюдается даже сравнительно с обычным локом на pthread_mutex, видимо, дело в том, что busy-wait слишком дорог. Условные переменные и семафоры ещё более тяжелы, чем просто мутексы, у них специфическая область применения.  Упомянутые "luburcu RCU" - не использовал, ничего сказать не смогу.


"атомарные синхронизации"
Отправлено d1987 , 31-Авг-10 10:39 
Спасибо за столь развёрнутый ответ!