Использование шаблона единицы работы в многопоточной среде
Я читаю Фаулерса PoEAA и пытаюсь понять, как правильно использовать описанные шаблоны "Единица работы" и "Карта идентичности" в многопоточной среде. Фаулер утверждает, что "Единица работы" должна быть локальной для потока, и он рекомендует делать то же самое с "Картой идентичности". Однако я не понимаю, как я смогу использовать эти шаблоны в многопоточной среде.
Предположим, что поток A загружает огромное дерево объектов из базы данных. Поэтому объекты хранятся в "Идентификационной карте" А и регистрируются в "Единице работы" А. Теперь я хочу выполнить некоторые операции обновления дерева, которые можно разделить на несколько потоков. Однако, если поток B изменяет объект, загруженный AI, потребуется зарегистрировать его "грязным" в "Единице работы" А, или мне нужно будет создать новую "Единицу работы" в B и там зарегистрировать его как "грязный".
Я вижу похожую проблему с "Identity Map". Если поток A загружает объект, который затем обрабатывается в потоке B, а B требуется загрузить зависимый объект, это портит концепцию, потому что теперь объект в "Identity Map" A указывает на другой объект в "Identity Map" B. Если в объект, сохраненный A, вносятся изменения, а в объект, сохраненный BI, вносятся изменения, то их необходимо зафиксировать одновременно.
Что мне нужно, так это преимущества обоих шаблонов в многопоточной среде, где я могу выполнять работу с некоторыми объектами, которые были загружены в одном потоке, но где работа над ними должна быть разделена между различными другими потоками. Также должна быть возможность разделить загрузку разных поддеревьев огромной древовидной структуры объектов между разными потоками.
В идеале пользователь моей библиотеки может выбрать, хочет ли он, чтобы изменения в объектах выполнялись в одном потоке, прозрачном для другого потока, или он хочет, чтобы оба потока работали с независимыми копиями объектов. Это разделение сеанса между потоками или нет.
Прямо сейчас я не вижу, как это могло быть достигнуто с этими двумя образцами. Может кто-нибудь дать небольшую подсказку или указать мне на рабочую реализацию, на которую я мог бы взглянуть, чтобы увидеть, как это можно сделать?
Кстати, я работаю в среде C++.