Как параллельно вызвать функцию так, чтобы она выжила после окончания работы вызывающей функции?
==================================================================================================

 Пишу dll для внешней программы.  

Функция a(string str) в Dll должна принимать string-и, сохранять их в вектор, через X миллисекунд обрабатывать накопившееся и результат передавать в функцию b(string result), которая иногда сохраняет его в SharedMemory, а иногда в БД.  

  

Данные очень часто приходят, т.е. функция может вызываться сотни раз в секунду.  

  

Дожидаться пока SharedMemory освободят или пока пройдёт запрос в БД - очень долго, поэтому хочется отправить результат обработки из a() в b() и сразу же делать return из a().  

  

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

  

2. Как отпустить функцию b(result) в свободное плавание? Я сначала думал сделать   

  

thread th(b);  

th.detach();  

  

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

Предполагаю что в dll, также как и в exe, она тоже не успеет доработать до конца.  

  

Верно ли я понимаю, что единственное решение, чтобы b(result) доработала до конца, в то время когда a(str) уже закончилась и вернула управление - это написать для b() отдельный exe и запускать её как отдельный процесс? 

> 1. Возможно ли что при столь частом вызове функции данные в векторе будут искажены или не полностью записаны? Порядок записей не важен.

  

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

> Как отпустить функцию b(result) в свободное плавание? Я сначала думал сделать  
> 
>   
> 
> thread th(b);  
> 
> th.detach();  
> 
>   
> 
> но потом понял что если бы это была обычная программа, а не dll, то th не успел бы доработать до конца, ибо завершилась бы вызывающая функция.  
> 
> Предполагаю что в dll, также как и в exe, она тоже не успеет доработать до конца.

  

Почему функция в потоке не успеет доработать до конца? Вы выгружаете dll из процесса?  

  

Можно сделать такую реализацию.   

Создается очередь. В первом потоке данные добавляются в очередь. Второй поток считывает данные из очереди и обрабатывает их. Результат работы передается во вторую очередь. Третий поток читает данные из второй очереди и заносит их БД или SharedMemory. Если данных нет, то поток просто ждет новые данные. Действия с очередями в разных потоках должны синхронизироваться через примитивы синхронизации (mutex).