Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.132.194] |
|
Страницы: (6) 1 2 [3] 4 5 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Конечно сложен, ты в нем сам даже толком не разобрался Допустим на вскидку: 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 если стек пустой? Вот тут я имею ввиду: Node<T>* OldHead = Head.load(); //! - вот эта шляпа что тебе возвратит, если стек твой пуст? while (OldHead && !Head.compare_exchange_weak(OldHead, OldHead->Next)); //! А тут что будет, если тебе возвратит отличное от 0 значение? Ты с указателями бы разобрался для начала, а уж потом бы lock-free алгоритмы писал. |
Сообщ.
#32
,
|
|
|
ЫукпШ, конечно большое спасибо за ответ!
Но, увы, слишком много букв, слишком много ненужных возможностей. А моя цель проста, никаких библиотечных реализаций, все - тупо для проекта. Никаких "расширений" - только 2 потока, строго 2 потока. Возникает вопрос, зачем мне все выше прочитанное? Возникает второй вопрос, а был ли прочтен вместе с кодом заданный вопрос с первом сообщении? |
Сообщ.
#33
,
|
|
|
Цитата JoeUser @ Возникает вопрос, зачем мне все выше прочитанное? Всё просто. Если возникает такой вопрос, значит и читать не надо. Добавлено Цитата JoeUser @ А моя цель проста, никаких библиотечных реализаций, все - тупо для проекта. Никаких "расширений" - только 2 потока, строго 2 потока. Это только кажется. Завтра к тебе придут и скажут: - Ты так классно сделал работу ! Нам понравилось, делай ещё много таких проектов, хороших и нужных. |
Сообщ.
#34
,
|
|
|
Цитата Wound @ Чему будет равно значение переменной OldHead в Pop'e если стек пустой? Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст; Цитата Wound @ Конечно сложен, ты в нем сам даже толком не разобрался Т.е я как-то написал, он работает, и я не разобрался, и ты кросава? Зашибись логика! Добавлено Скрытый текст Цитата ЫукпШ @ Завтра к тебе придут и скажут: Это вообще оффтоп. Но не скажут - щя получилось так, я являюсь и Заказчиком И Исполнителем. |
Сообщ.
#35
,
|
|
|
Цитата JoeUser @ Скрытый текст Цитата ЫукпШ @ Завтра к тебе придут и скажут: Это вообще оффтоп. Но не скажут - щя получилось так, я являюсь и Заказчиком И Исполнителем. Скрытый текст ... На предварительном следствии в полицейском участке на все вопросы он вопил одну и ту же стереотипную фразу: — У меня писчебумажный магазин! На что получал такой же стереотипный ответ: — Это для вас не оправдание. ... |
Сообщ.
#36
,
|
|
|
ЫукпШ, у меня лишь одно оправдание - я не стараюсь предугадывать будущее, а стараюсь оперативно решать текущие вопросы. И решать максимально быстро. Другой вопрос "а качественно ли?". Стараюсь качественно. Но приоритет - сроки, потом качество. И да, грешен, иногда приходится говнокодить.
Но по теме ... не представляю, зачем на компе 2 и более одинаковых кард-считывателя. У меня моск разрушается! |
Сообщ.
#37
,
|
|
|
Цитата JoeUser @ Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст; Давно у shared_ptr метод load появился? Цитата JoeUser @ .е я как-то написал, он работает, и я не разобрался, и ты кросава? Зашибись логика! Тебе только кажется что оно работает. |
Сообщ.
#38
,
|
|
|
Цитата Wound @ Давно у shared_ptr метод load появился? Это метод std::atomic ващето!censored Добавлено Цитата Wound @ Тебе только кажется что оно работает. Ну запили тесты, я прогоню все что скажешь. Но, по-моему, ты считаешь себя умнее Энтони Уильямса. При всем моем уважении к тебе - я уверен, ты себя переоцениваешь. |
Сообщ.
#39
,
|
|
|
Цитата JoeUser @ Это метод std::atomic ващето! Ты чего там? ку-ку?? Да неужели. Перечитай ещё раз мой пост выше. Я даже тебе комментарии к проблемным участкам написал |
Сообщ.
#40
,
|
|
|
Цитата JoeUser @ Но по теме ... не представляю, зачем на компе 2 и более одинаковых кард-считывателя. У меня моск разрушается! Это легко ! Скрытый текст Очень люблю почитать. У меня в электронной книге стоит карточка с личной подборкой - очень много уже, гигабайт 10 скопилось. Понадобилось/захотелось сбросить копию на другую карточку. Вставил 2 карт-ридера и скопировал с одной карты на другую. |
Сообщ.
#41
,
|
|
|
Добрался до компа, давай еще раз:
Цитата JoeUser @ Если стек не пуст - pop() вернет последний OldHead->Data или пустой std::shared_ptr<T>(), если стек пуст; Причем тут что вернет pop? Я спрашивал: Цитата Wound @ Чему будет равно значение переменной OldHead в Pop'e если стек пустой? Теперь на пальцах: 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 @ Но, по-моему, ты считаешь себя умнее Энтони Уильямса. При всем моем уважении к тебе - я уверен, ты себя переоцениваешь. Речь идет о твоем коде вообще то, а про Энтони Уильямса. |
Сообщ.
#42
,
|
|
|
Как минимум не инициализировал FreeStack::Head.
Не надо. Слишком простой пример. В целом если, конечно любую стартовую функцию потока нужно рассматривать наравне с main(). У тебя это WriterThread::operator()(). Неперехваченное исключение прибьёт всё приложение. Если это не устраивает, то нужно как-то хендлить. Цитата JoeUser @ Ну блин. Кто ж помимо тебя на это ответит-то? Зависит от задачи. Юзеру с головой достаточно 100мс реакции, процессам реального времени и 1мс может оказаться много. 3) По скольку отдельная нить не заточена на вычисления, а скорее на ожидания - какой интервал опроса имеет смысл оставить, чтобы попусту не грузить систему? |
Сообщ.
#43
,
|
|
|
Цитата JoeUser @ а стараюсь оперативно решать текущие вопросы. Выдать сложный алгоритм вместо простого без малейших обоснований того, что простой будет работать так же эффективно это что угодно, но не "оперативное решение текущих вопросов". |
Сообщ.
#44
,
|
|
|
Цитата Pavia @ Этих фраз даже я не понял. Набор слов. Pavia, попрошу быть конкретнее, чтобы тебя можно было понимать по-русски. Так что, увы, не рассказал. По поводу QT проблемы с глобальными сиглтонами из-за параллельной сборки он в исполняемые файлы пихает несколько штук. Пришлось через разделяемую память делать свой синглтон и на основе него мьютексы для блокировок. |
Сообщ.
#45
,
|
|
|
OpenGL, ты мне помнится доказывал что в С++ утечек нет. Узри:
Цитата Wound @ Node<T>* const NewNode = new Node<T>(iData); //! <<< Выделение памяти И где этот хваленный RAII ? И вот такого кода тонны по всюду. У него в Попе стэка или в том же пуше, после выделения памяти произойдет исключение - и утечка ресурса гарантирована. |