The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Синхронизация 2 потоков, !*! d1987, 30-Авг-10, 19:47  [смотреть все]
Помогите пожалуйста разобраться.

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

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

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




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру