@samokiller

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

Пишу 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 и запускать её как отдельный процесс?
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
1. Возможно ли что при столь частом вызове функции данные в векторе будут искажены или не полностью записаны? Порядок записей не важен.

Если данные пишутся в одном потоке, то никакого искажения не будет. В разных потоках используйте примитивы синхронизации.
Как отпустить функцию b(result) в свободное плавание? Я сначала думал сделать

thread th(b);
th.detach();

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

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

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы