Здравствуйте, Caracrist, Вы писали:
C>Потестировал всё это дело на скорость... Быстре просто лочить по тупому и всё.
C>Interlocked быстрее только если буфер маленький относительно количества потоков, а операция копирования дорогая...
C>Вывод: лочить простым мутексом и копировать указатели. Меньше шансов на баги и производительность супер.
Преимущество lock-free не в скорости лока, а в отсутствии ожидания потоков друг друга. Напимер код
EnterCriticalSection
a++;
LeaveCriticalSection
на x86 всего лишь в два раза медленнее, чем InterlockedIncrement, даже без spincount, но только если секция в момент захвата свободна. Если же потоки часто "пересекаются" на общем ресурсе, то lock-free даст лучшую производительность системы за счёт отсутствия ожидания потоками доступа к ресурсу, в том числе и за счёт уменьшения переключений контекстов потоков. Последнее, правда, можно несколько снивелировать, предваряя усыпление потока spin-lock'ом.