На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> create_task и синхронизация потоков , надо самому синхронизировать или механизм create_task предусматривает?
    Уважаемые знатоки, возник у меня вопрос.

    Использую 2017 студию, C++ проект.
    Столкнулся с механизмом create_task, хорошая вещь, особенно если просто нужно сохранить данные в файл.

    Мне стало интересно, в задачах-продолжения я обращаюсь к нескольким массивам данных, к которым основной поток не перестает обращаться.
    Ввиду асинхронности, похоже, программа сохранения выполняется в другом потоке, возникает вопрос:

    Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ?
    Спасибо :)
      Цитата simsergey @
      Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ?

      Судя по докам - о каких-то механизмах по асинхронной работе с данными ничего не сказано. Следовательно, нужно предусмотреть этот механизм самостоятельно. ИМХО.
        Цитата simsergey @
        Создаваемые задачи-продолжения требуют реализации блокировки данных или механизм уже предусматривает к ним свободный доступ?

        Если речь идёт о манипуляции данными из разных потоков, то должен использоваться
        один и тот же объект синхронизации из всех потоков.
        Значит, если хоть один поток это средство не использует, то "всё".
        ---
        Используются ли в твоём случае разные потоки ? Не знаю.
        Задействуй функцию "GetCurrentThreadId".
        Если идентификаторы разные, значит потоки - разные. Синхронизация нужна.
        Если идентификаторы одинаковы, значит указанный механизм использует
        один поток и синхронизация не нужна.
          В общем-то, добавил механизмы, использующие create_task - посыпалось много ошибок доступа, из отладчика студии стало понятно что и где.
          Пока ограничился критическими секциями для синхронизации потоков.

          А началось с того, что решил сделать сохранение и загрузку информации, все бы ничего, да стандартные функции доступа к файлам возвращают Accees denied (приложение UWP Win 10), можно использовать только функции асинхронного доступа (CreateAsync, OpenAsync...) - получаем кучу головной боли по синхронизации доступа к общим данным и обменом контекстами задач-продолжений...

          Сейчас наблюдаю интересную ситуацию, вызываю функцию сохранения в обработчике SaveState, вызываемого при закрытии приложения. В доках пишут, что на SaveState у приложения время ограничено (не помню точное значение) и можно использовать асинхронные алгоритмы, если требуется больше.
          У меня цепочка задач сохранения обрывается в разных звеньях (не стартуют задачи-продолжения) и прога закрывается.

          Интересно, чем можно было бы сберечь цепочку асинхронных задач от разрыва при закрытии, учитывая, что механизмы майкрософт CreateAsync, OpenAsync.. требуют создания новых цепочек в теле задачи-продолжения? :)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0261 ]   [ 16 queries used ]   [ Generated: 29.03.24, 08:35 GMT ]