Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.221.239.148] |
|
Сообщ.
#1
,
|
|
|
Уважаемые знатоки, возник у меня вопрос.
Использую 2017 студию, C++ проект. Столкнулся с механизмом create_task, хорошая вещь, особенно если просто нужно сохранить данные в файл. Мне стало интересно, в задачах-продолжения я обращаюсь к нескольким массивам данных, к которым основной поток не перестает обращаться. Ввиду асинхронности, похоже, программа сохранения выполняется в другом потоке, возникает вопрос: Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ? Спасибо |
Сообщ.
#2
,
|
|
|
Цитата simsergey @ Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ? Судя по докам - о каких-то механизмах по асинхронной работе с данными ничего не сказано. Следовательно, нужно предусмотреть этот механизм самостоятельно. ИМХО. |
Сообщ.
#3
,
|
|
|
Цитата simsergey @ Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ? Если речь идёт о манипуляции данными из разных потоков, то должен использоваться один и тот же объект синхронизации из всех потоков. Значит, если хоть один поток это средство не использует, то "всё". --- Используются ли в твоём случае разные потоки ? Не знаю. Задействуй функцию "GetCurrentThreadId". Если идентификаторы разные, значит потоки - разные. Синхронизация нужна. Если идентификаторы одинаковы, значит указанный механизм использует один поток и синхронизация не нужна. |
Сообщ.
#4
,
|
|
|
В общем-то, добавил механизмы, использующие create_task - посыпалось много ошибок доступа, из отладчика студии стало понятно что и где.
Пока ограничился критическими секциями для синхронизации потоков. А началось с того, что решил сделать сохранение и загрузку информации, все бы ничего, да стандартные функции доступа к файлам возвращают Accees denied (приложение UWP Win 10), можно использовать только функции асинхронного доступа (CreateAsync, OpenAsync...) - получаем кучу головной боли по синхронизации доступа к общим данным и обменом контекстами задач-продолжений... Сейчас наблюдаю интересную ситуацию, вызываю функцию сохранения в обработчике SaveState, вызываемого при закрытии приложения. В доках пишут, что на SaveState у приложения время ограничено (не помню точное значение) и можно использовать асинхронные алгоритмы, если требуется больше. У меня цепочка задач сохранения обрывается в разных звеньях (не стартуют задачи-продолжения) и прога закрывается. Интересно, чем можно было бы сберечь цепочку асинхронных задач от разрыва при закрытии, учитывая, что механизмы майкрософт CreateAsync, OpenAsync.. требуют создания новых цепочек в теле задачи-продолжения? |