Как параллельно вызвать функцию так, чтобы она выжила после окончания работы вызывающей функции?
Пишу 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).
Почему функция в потоке не успеет доработать до конца? Вы выгружаете dll из процесса?
dll не выгружаю. Возможно я ошибаюсь, но thread.detach() живёт до тех пор, пока не закончится функция в которой был создан и детачнут thread. Или я ошибаюсь и это только к main() в exe относится?
Про очереди, спасибо. Это, видимо, один из тех примитивов которые я когда то пропустил)