На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (6) 1 2 [3] 4 5 ... Последняя » все  ( Перейти к последнему сообщению )  
> Распараллеливание выполнения без блокировок
    Цитата JoeUser @
    Что мой FreeStack так серьезно сложен? Да ладно? Да ладно!

    Конечно сложен, ты в нем сам даже толком не разобрался :lol:
    Допустим на вскидку:
    ExpandedWrap disabled
      void Push(T const& iData) {
            Node<T>* const NewNode = new Node<T>(iData);
            NewNode->Next = Head.load();
            while (!Head.compare_exchange_weak(NewNode->Next, NewNode));
          }
          std::shared_ptr<T> Pop() {
            Node<T>* OldHead = Head.load();
            while (OldHead && !Head.compare_exchange_weak(OldHead, OldHead->Next));
            return OldHead ? OldHead->Data : std::shared_ptr<T>();
          }

    Чему будет равно значение переменной OldHead в Pop'e если стек пустой?
    Вот тут я имею ввиду:
    ExpandedWrap disabled
       Node<T>* OldHead = Head.load(); //! - вот эта шляпа что тебе возвратит, если стек твой пуст?
       
      while (OldHead && !Head.compare_exchange_weak(OldHead, OldHead->Next)); //! А тут что будет, если тебе возвратит отличное от 0 значение?

    Ты с указателями бы разобрался для начала, а уж потом бы lock-free алгоритмы писал.
    Сообщение отредактировано: Wound -
      ЫукпШ, конечно большое спасибо за ответ!
      Но, увы, слишком много букв, слишком много ненужных возможностей.
      А моя цель проста, никаких библиотечных реализаций, все - тупо для проекта.
      Никаких "расширений" - только 2 потока, строго 2 потока.

      Возникает вопрос, зачем мне все выше прочитанное?
      Возникает второй вопрос, а был ли прочтен вместе с кодом заданный вопрос с первом сообщении?
        Цитата JoeUser @
        Возникает вопрос, зачем мне все выше прочитанное?

        Всё просто.
        Если возникает такой вопрос, значит и читать не надо.

        Добавлено
        Цитата JoeUser @
        А моя цель проста, никаких библиотечных реализаций, все - тупо для проекта.
        Никаких "расширений" - только 2 потока, строго 2 потока.

        Это только кажется.
        Завтра к тебе придут и скажут:
        - Ты так классно сделал работу !
        Нам понравилось, делай ещё много таких проектов, хороших и нужных.
          Цитата Wound @
          Чему будет равно значение переменной OldHead в Pop'e если стек пустой?

          Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст;

          Цитата Wound @
          Конечно сложен, ты в нем сам даже толком не разобрался

          Т.е я как-то написал, он работает, и я не разобрался, и ты кросава? :lol:
          Зашибись логика! :jokingly:

          Добавлено
          Скрытый текст
          Цитата ЫукпШ @
          Завтра к тебе придут и скажут:

          Это вообще оффтоп. Но не скажут - щя получилось так, я являюсь и Заказчиком И Исполнителем.
            Цитата JoeUser @
            Скрытый текст
            Цитата ЫукпШ @
            Завтра к тебе придут и скажут:

            Это вообще оффтоп. Но не скажут - щя получилось так, я являюсь и Заказчиком И Исполнителем.

            Скрытый текст

            ...
            На предварительном следствии в полицейском участке на все вопросы он вопил одну и ту же стереотипную фразу:
            — У меня писчебумажный магазин!
            На что получал такой же стереотипный ответ:
            — Это для вас не оправдание.
            ...
            Сообщение отредактировано: ЫукпШ -
              ЫукпШ, у меня лишь одно оправдание - я не стараюсь предугадывать будущее, а стараюсь оперативно решать текущие вопросы. И решать максимально быстро. Другой вопрос "а качественно ли?". Стараюсь качественно. Но приоритет - сроки, потом качество. И да, грешен, иногда приходится говнокодить.

              Но по теме ... не представляю, зачем на компе 2 и более одинаковых кард-считывателя. У меня моск разрушается!
                Цитата JoeUser @
                Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст;

                Давно у shared_ptr метод load появился?


                Цитата JoeUser @
                .е я как-то написал, он работает, и я не разобрался, и ты кросава?
                Зашибись логика!

                Тебе только кажется что оно работает.
                  Цитата Wound @
                  Давно у shared_ptr метод load появился?

                  Это метод std::atomic ващето!censored

                  Добавлено
                  Цитата Wound @
                  Тебе только кажется что оно работает.

                  Ну запили тесты, я прогоню все что скажешь.

                  Но, по-моему, ты считаешь себя умнее Энтони Уильямса.
                  При всем моем уважении к тебе - я уверен, ты себя
                  переоцениваешь.
                  Сообщение отредактировано: Qraizer -
                    Цитата JoeUser @
                    Это метод std::atomic ващето! Ты чего там? ку-ку??

                    Да неужели. Перечитай ещё раз мой пост выше. Я даже тебе комментарии к проблемным участкам написал
                      Цитата JoeUser @
                      Но по теме ... не представляю, зачем на компе 2 и более одинаковых кард-считывателя. У меня моск разрушается!

                      Это легко !
                      Скрытый текст

                      Очень люблю почитать.
                      У меня в электронной книге стоит карточка с личной подборкой - очень много
                      уже, гигабайт 10 скопилось.
                      Понадобилось/захотелось сбросить копию на другую карточку.
                      Вставил 2 карт-ридера и скопировал с одной карты на другую.
                      Сообщение отредактировано: ЫукпШ -
                        Добрался до компа, давай еще раз:

                        Цитата JoeUser @
                        Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст;

                        Причем тут что вернет pop?
                        Я спрашивал:
                        Цитата Wound @
                        Чему будет равно значение переменной OldHead в Pop'e если стек пустой?


                        Теперь на пальцах:
                        ExpandedWrap disabled
                          template <typename T>
                          class FreeStack {
                              std::atomic<Node<T>*> Head; //! <<< Голый указатель обернутый в std::atomic
                            public:
                              void Push(T const& iData) {
                                Node<T>* const NewNode = new Node<T>(iData); //! <<< Выделение памяти
                                NewNode->Next = Head.load(); //! <<<< Что тут вернет load, если стек пустой???? nullptr ??? Ты уверен в этом? :D
                                while (!Head.compare_exchange_weak(NewNode->Next, NewNode));
                              }
                              std::shared_ptr<T> Pop() {
                                Node<T>* OldHead = Head.load(); //! <<<< Что тут вернет load, если стек пустой ???? nullptr ??? Ты уверен в этом? :D
                                while (OldHead && !Head.compare_exchange_weak(OldHead, OldHead->Next)); //!  <<< Тут идет проверка что если OldHead не nullptr - что то сделать,
                          //! в частности если память для OldHead выделена не была(а вызов pop легко может быть вызвон до push), и при этом OldHead не равен nullptr, Грохнется вот тут -> OldHead->Next <<< Access Violation
                                return OldHead ? OldHead->Data : std::shared_ptr<T>();
                              }
                          };

                        Так понятнее ?

                        Я лично не вижу нигде в этом коде где бы Head'у или NewNode->Next'у выставлялся nullptr. Или по стандарту неинициализированные указатели у нас всегда равны nullptr?

                        Добавлено
                        Цитата JoeUser @
                        Но, по-моему, ты считаешь себя умнее Энтони Уильямса.
                        При всем моем уважении к тебе - я уверен, ты себя
                        переоцениваешь.

                        Речь идет о твоем коде вообще то, а про Энтони Уильямса.
                        Сообщение отредактировано: Wound -
                          Цитата JoeUser @
                          1) Где какие ошибки я допустил?
                          Как минимум не инициализировал FreeStack::Head.
                          Цитата JoeUser @
                          2) В каких местах имеет смысл ловить и обрабатывать исключения?
                          Не надо. Слишком простой пример. В целом если, конечно любую стартовую функцию потока нужно рассматривать наравне с main(). У тебя это WriterThread::operator()(). Неперехваченное исключение прибьёт всё приложение. Если это не устраивает, то нужно как-то хендлить.
                          Цитата JoeUser @
                          3) По скольку отдельная нить не заточена на вычисления, а скорее на ожидания - какой интервал опроса имеет смысл оставить, чтобы попусту не грузить систему?
                          Ну блин. Кто ж помимо тебя на это ответит-то? Зависит от задачи. Юзеру с головой достаточно 100мс реакции, процессам реального времени и 1мс может оказаться много.
                            Цитата JoeUser @
                            а стараюсь оперативно решать текущие вопросы.

                            Выдать сложный алгоритм вместо простого без малейших обоснований того, что простой будет работать так же эффективно это что угодно, но не "оперативное решение текущих вопросов".
                              Цитата Pavia @
                              По поводу QT проблемы с глобальными сиглтонами из-за параллельной сборки он в исполняемые файлы пихает несколько штук. Пришлось через разделяемую память делать свой синглтон и на основе него мьютексы для блокировок.
                              Цитата Pavia @
                              Я вам рассказал про подводные камни. А что с ними делать это вам решать.
                              Этих фраз даже я не понял. Набор слов. Pavia, попрошу быть конкретнее, чтобы тебя можно было понимать по-русски. Так что, увы, не рассказал.
                              Сообщение отредактировано: Qraizer -
                                OpenGL, ты мне помнится доказывал что в С++ утечек нет. Узри:
                                Цитата Wound @
                                Node<T>* const NewNode = new Node<T>(iData); //! <<< Выделение памяти

                                И где этот хваленный RAII ? И вот такого кода тонны по всюду.
                                У него в Попе стэка или в том же пуше, после выделения памяти произойдет исключение - и утечка ресурса гарантирована.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0574 ]   [ 16 queries used ]   [ Generated: 1.05.24, 23:45 GMT ]