Оптимальное разделение функций между исходными файлами - PullRequest
0 голосов
/ 01 марта 2019

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

Один поток, MtoD , извлекает сообщение из очереди сообщений IPC, обрабатывает его и затем отправляет команды драйверу физического интерфейса.Другой поток, DtoM , получает прерывания от этого драйвера, обрабатывает ввод и затем отправляет результаты в сообщении в очередь IPC.

Очевидные способы разделения кода на дваявляются:

  • по потоку : два исходных файла, MtoD.c и DtoM.c, каждый из которых содержит все функции одного потока - но оба файла должны иметь дело соба интерфейса
  • по интерфейсу : два исходных файла, Mc и Dc, каждый из которых занимается всеми делами, связанными с определенным внешним интерфейсом, но потоки проходят через оба файла.

Мои опасения

  1. поддержка кода .Делая это потоком, легче следовать логике потока (без переключения между файлами).Но кто-то, кто написал бы этот объектно-ориентированный, вероятно, обернул бы интерфейс к очередям IPC в одном классе, который был бы в одном файле, и интерфейсе драйвера в другом файле.
  2. производительность .Если у вас есть объектные файлы Mo и Do, у каждого будет только одна внешняя библиотека, но они должны вызывать друг друга во время выполнения потока.Влечет ли это какие-либо накладные расходы (если компоновщик превратил их в один двоичный файл)?Если у вас есть MtoD.o и DtoM.o, вы можете объявить большинство функций как static, что может привести к еще большей оптимизации компилятора.Но понадобятся ли им обоим ссылки на внешние библиотеки?

Какой путь оптимален?

1 Ответ

0 голосов
/ 01 марта 2019

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

Хорошо, третий вариант: один поток?Если я правильно вас понял, вы подключаете интерфейс к IPC, поэтому, если один поток одновременно реагирует на вход с одной стороны и отправляет его с другой стороны?Я не думаю, что вы теряете много времени для ответа таким образом, если таковые имеются, и у вас есть все это в одном месте.Если источник слишком велик, вы можете посмотреть, какие классы вы можете разделить, а не разделять на потоки или интерфейсы.

...