2014-12-04 4 views
3

Я создаю общую библиотеку с классом, который создает поток в своем конструкторе, который запускает его до вызова деструктора. Все методы этого класса являются потокобезопасными. Что-то вроде этого:Неправильная практика создания потока в общей библиотеке?

class NetworkRPCConnection { 
    std::thread t; 
public: 
    NetworkRPCConnection() : t([](){maintain_connection();}) {} 
    ~NetworkRPCConnection(){close_connection(); t.join();} 
} 

Это прекрасно работает, но неудобно ли создавать поток в общей библиотеке? Стоит ли упоминать в документации API, или лучше скрыть эту деталь реализации?

+3

Определенно документируйте его в API. – randomusername

+0

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

+1

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

ответ

7

В общем, лучше избегать создания потоков в общих библиотеках, но есть обстоятельства, когда это нормально - но в этих случаях вам действительно нужно документировать его в вашем API.

Причина, по которой вам необходимо документировать это, заключается в том, что потоки могут взаимодействовать в трудном для прогнозирования способах с определенными операциями - особенно fork() и сигналами; это делает невозможным полностью «скрыть» поток как деталь реализации, потому что пользователь библиотеки должен знать об этом.

Что касается того, почему лучше не создавать потоки: обычно пользователь библиотеки лучше разбирается в своей модели потоковой передачи - например, у них может уже быть поток, с которым можно было бы работать, поэтому создание другого только создает дополнительные накладные расходы (и ограничивает их реализацию). Но если вы хорошо знаете требования пользователя библиотеки и знаете, что нужен эксклюзивный поток, и он может позаботиться обо всех аспектах жизни потока - тогда может быть хорошо создать и управлять потоком самостоятельно, но, поскольку упомянутый выше, вам определенно нужно документировать его.

Смежные вопросы