Первая точка: программирование без блокировки не обязательно повышает скорость. Программирование без блокировки (если все сделано правильно) гарантирует продвижение вперед. Когда вы используете блокировки, возможно, что один поток потерпит крах (например, перейдет в бесконечный цикл), удерживая мьютекс. Когда / если это произойдет, никакой другой поток, ожидающий этого мьютекса, не сможет больше продвинуться. Если этот мьютекс занимает центральное место в нормальной работе, вам, возможно, придется перезапустить весь процесс, прежде чем вообще можно будет выполнить какую-либо работу. При программировании без блокировки таких обстоятельств возникнуть не может. Другие потоки могут продвигаться вперед, независимо от того, что происходит в одном потоке 1 .
Тем не менее, да, одна из вещей, на которые вы надеетесь , - это часто лучшая производительность, но чтобы увидеть ее, вам, вероятно, понадобится более четырех потоков. Где-то в диапазоне от десятков до сотен потоков ваш код без блокировок будет иметь гораздо больше шансов продемонстрировать улучшенную производительность по сравнению с очередью на основе блокировок. Однако, чтобы действительно сделать много хорошего, вам нужно не только больше потоков, но и больше ядер - по крайней мере, исходя из того, что я видел до сих пор, с четырьмя ядрами и хорошо написанным кодом, вряд ли будет достаточно конфликт за блокировку для программирования без блокировок, чтобы показать значительное (если таковое имеется) выигрыш в производительности.
Итог: больше потоков (по крайней мере, пара десятков) увеличат шансы очереди без блокировок, показывающей выигрыш в производительности, но с только четырьмя ядрами, это не будет ужасно удивительно, если очередь на основе блокировки все еще идет в ногу. Если вы добавите достаточное количество потоков и ядер, практически неизбежно победит версия без блокировки. Точное количество необходимых потоков и ядер сложно предсказать, но вы должны думать как минимум о десятках.
1 По крайней мере, что-то вроде мьютекса. Нечто похожее на бомбу-вилку, которая просто съела все системные ресурсы, может лишить другие потоки достаточного количества ресурсов, чтобы что-то сделать, но некоторые заботы о таких вещах, как квоты, обычно тоже могут это предотвратить.