Использование асинхронного метода против ожидания потока - PullRequest
1 голос
/ 12 апреля 2011

У меня есть 2 версии функции, которые доступны в библиотеке C ++ и выполняют ту же задачу. Одна является синхронной функцией, а другая асинхронного типа, которая позволяет регистрировать функцию обратного вызова.

Какая из приведенных ниже стратегий предпочтительна для улучшения оптимизации памяти и производительности?

  1. Вызвать синхронную функцию в рабочем потоке и использовать взаимную синхронизацию, чтобы подождать, пока я не получу результат
  2. Не создавать поток, а вызвать асинхронную версию и получить результат в обратном вызове

Мне известно, что создание рабочего потока в варианте 1 вызовет дополнительные издержки. Я хочу знать проблемы, связанные с издержками, вызванными объектами синхронизации потоков, и с тем, как они сравниваются с издержками, вызванными асинхронным вызовом. Асинхронная версия функции внутренне раскручивает поток и использует объект синхронизации, или она использует какую-то другую технику, такую ​​как прямое обращение к ядру?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

"Профиль, не спекулируйте."(DJB)

Ответ на этот вопрос зависит от слишком многих вещей, и общего ответа нет.Роль разработчика заключается в том, чтобы иметь возможность принимать эти решения.Если вы не знаете, попробуйте варианты и измерить.Во многих случаях разница не будет иметь значения, и проблемы с производительностью будут доминировать.

«Преждевременная оптимизация - корень всех зол, скажем, 97% времени» (DEK)

Обновление в ответ на вопрос edit:

Библиотеки C ++, как правило, не используют магию, чтобы избежать примитивов синхронизации.Асинхронный и синхронный интерфейсы, вероятно, будут обертками вокруг вещей, которые вы все равно будете делать.Обработка должна происходить в контексте, и если о завершении нужно сообщить в другом контексте, для этого потребуется примитив синхронизации.

Конечно, могут быть и другие соображения.Если ваша библиотека C ++ взаимодействует с каким-то оборудованием, которое может выполнять обработку, все может быть иначе.Но вы не говорили нам ни о чем подобном.

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

0 голосов
/ 13 апреля 2011

Можно подумать, что каждый из потоков имеет свою собственную среду, поэтому они используют больше памяти, чем не поточное решение, когда все остальные равны.

В зависимости от вашей библиотеки потоков также могут быть значительные накладные расходы на запуск и запуск.Остановка потоков.

Если вам нужна межпроцессная синхронизация, отладка многопоточного кода также может быть очень затруднительной.

Если вам удобно писать непоточный код (т.е. вы не будете много записыватьвремя написания и отладки) тогда это может быть лучшим выбором.

0 голосов
/ 12 апреля 2011

Используйте асинхронную функцию, потому что, вероятно, будете делать то, что вы хотите сделать вручную, с синхронной, но менее подверженной ошибкам.

Асинхронный: создаст поток, выполнит работу, когда будет сделано -> обратный вызов вызова
Синхронный: создаст событие, которое ожидает, Создать поток для работы, Ожидание события, Версия синхронизации вызова потока,результат передачи, сигнальное событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...