ИМХО, многопоточность - не лучшее решение для такого рода классов.
Введение фоновых потоков может вызвать много проблем, вы должны по крайней мере разработать средства защиты от создания нескольких ненужных потоков.Также потоки нуждаются в явной инициализации и очистке.Например, обычная очистка потока включает в себя операцию объединения потоков (ожидание остановки потока), которая может привести к взаимоблокировкам, утечкам ресурсов, безответственным пользовательским интерфейсам и т. Д.
Однопоточная асинхронная связь через сокет может быть более подходящей для этого сценария.
Позвольте мне нарисовать пример кода об этом:
class Tmt {
...
public:
...
bool doProcessing()
{
receiverData();
// process data
// return true if data available
}
T getProcessedData()
{
// return processed data
}
}
Пользователи класса Tmt должны запустить цикл, выполняя вызов doProcessing, getProcessedData.
Tmt myTmt;
...
while (needMoreData)
{
if (myTmt.doProcessing())
{
myTmt.getProcessedData();
...
}
}
Если пользователи Tmt хотят фоновую обработку, ониможет легко создать другой поток и делать там работу Tmt.На этот раз работы по управлению потоками выполняются пользователями Tmt.
Если пользователи Tmt предпочитают однопотоковый подход, они могут сделать это без каких-либо проблем.
Также отмечено, что известная библиотека curl использует этот вид дизайна.