Russian Qt Forum
Ноябрь 26, 2024, 20:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4 5   Вниз
  Печать  
Автор Тема: Многопоточное программирование  (Прочитано 54367 раз)
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #30 : Ноябрь 01, 2013, 12:07 »

А чего код не предъявляем?

Я не думал, что вы настолько беспомощны.  Строит глазки
Код
C++ (Qt)
m_finished = true;
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #31 : Ноябрь 01, 2013, 12:10 »

Я не думал, что вы настолько беспомощны.  Строит глазки
Код
C++ (Qt)
m_finished = true;
 
Не наблюдаю такого http://en.cppreference.com/w/cpp/thread/thread
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #32 : Ноябрь 01, 2013, 12:12 »

Не наблюдаю такого http://en.cppreference.com/w/cpp/thread/thread
А вы хотите, что бы стандартная библиотека за вас и код нитки писала? Зовите "Двоих из ларца, одинаковых с лица". Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Ноябрь 01, 2013, 12:44 »

2Igors Потратил на вас немного времени и набросал небольшой пример:
ВНИМАНИЕ! Это пример, не надо у меня спрашивать почему здесь нет средств синхронизации. /* А то сейчас из пальца проблемы будем высасывать. */ Улыбающийся
Использовал буст, ибо собирается и без нового стандарта, заинтересованные могут переписать пример сами.
Код
C++ (Qt)
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/bind.hpp>
#include <iostream>
 
class Thread
{
public:
       Thread() : m_finished( true ) {}
 
       void    start()
       {
               m_th.reset( new boost::thread( boost::bind( &Thread::thread_func, this ) ) );
       }
 
       void    wait()
       {
               m_th->join();
       }
 
protected:
       virtual void    run()
       {
               std::cout << "Child thread-id = " << boost::this_thread::get_id() << std::endl;
       }
 
private:
       boost::shared_ptr<boost::thread>                m_th;
       bool                    m_finished;
 
       void    thread_func()
       {
               m_finished = false;
               run();
               m_finished = true;
       }
};
 
 
int main()
{
       std::cout << "Main thread-id = " << boost::this_thread::get_id() << std::endl;
 
       Thread t;
       t.start();
       t.wait();
 
       return 0;
}
 

Понимаю, насколько это сложный пример для вас, поэтому понимания не жду. Улыбающийся
« Последнее редактирование: Ноябрь 01, 2013, 12:45 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #34 : Ноябрь 01, 2013, 13:01 »

Понимаю, насколько это сложный пример для вас, поэтому понимания не жду. Улыбающийся
По-моему он просто неправильный  Улыбающийся
Код
C++ (Qt)
Thread t;
t.start();
if (t.m_finished)
printf("Уже? :-)");
 
Ну и все-таки мы говорим об std (а не о бусте). Может так
Код
C++ (Qt)
 
   std::thread th(foo);
   if (th.get_id() == std::thread::id())
    printf("finished");
 
?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #35 : Ноябрь 01, 2013, 13:05 »

По-моему он просто неправильный  Улыбающийся
Ну так это по вашему. Но вы в очередной раз заблуждаетесь. Подмигивающий

Может так
А что по вашему сделает этот код? Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Ноябрь 02, 2013, 11:15 »

Ну так это по вашему. Но вы в очередной раз заблуждаетесь. Подмигивающий
Давайте посмотрим кто заблуждается
Код
C++ (Qt)
       void    thread_func()
       {
               m_finished = false;
               run();
               m_finished = true;
       }
 
Гарантируется что thread_func будет выполняться в созданной нитке. Но когда выполнится первая строка - хз, возможно нитка будет немедленно вытеснена, и m_finished все еще true когда главная его прочитает. Нужно перенести присвоение в start, и лучше оформить это как m_isRunning

А что по вашему сделает этот код? Улыбающийся
Не знаю. Прочитал это
Цитировать
Return value

A value of type std::thread::id identifying the thread associated with *this. If there is no thread associated, default constructed std::thread::id is returned.
Я так понял что когда нитка завершится ее id будет равно дефаулту. Так это или нет - почему бы не спросить знатоков std? Сам лично этой частью std никогда не пользовался. Без Qt юзаю старую обертку для запуска ниток для Вындоуз и Unix (досталась в наследство) которая делает все что мне надо.

По поводу std - я ж не против, как видите, охотно наблюдаю (боковым зрением). Мне толкуют надо осваивать новые технологии, а то отстанешь от жизни и все такое. Ладно, задаю ПРОСТЕЙШИЙ, напрашивающийся вопрос  - и что? Один сразу нырнул в дуст (наверное привык там делать), а другого вообще как ветром сдуло Улыбающийся Выходит вся ота "грамотность" - чисто понты, пролистать и попытаться запомнить как можно больше. Или я ошибаюсь?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Ноябрь 02, 2013, 12:07 »

Давайте посмотрим кто заблуждается
Давайте.
В своем посте я специально для вас написал следующую строку:
Цитировать
ВНИМАНИЕ! Это пример, не надо у меня спрашивать почему здесь нет средств синхронизации. /* А то сейчас из пальца проблемы будем высасывать. */
Я понимаю что вы ее не прочли (или не поняли).
Поэтому, если вы добавите некоторые средства синхронизации, а без них это просто демонстрашка, которую в реальный код вставлять и близко нельзя, то увидите, что этот код заработает верно, всегда!
Оставляю вам это в качестве домашнего задания, заодно посмотрите какие есть средства синхронизации потоков в стандартной библиотеке, уверен что вас некоторые моменты очень удивят.
Если не получиться - пишите, я покажу как это можно сделать.

Не знаю. Прочитал это
Цитировать
Я не могу понять, чего вы ходите достичь. Определения момента завершения нитки? Предлагаете сравнивать в цикле? Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #38 : Ноябрь 02, 2013, 16:42 »

Один сразу нырнул в дуст (наверное привык там делать)
Да, на вас уже жалко смотреть, такой вы беспомощный. В стандарт (std) все перешло как раз из boost, вышеприведенный пример переделывается на std за несколько минут. Грустный Да и не нужно его переделывать, это была демонстрация одного из вариантов реализации флага состояния нитки. В боевых проектах и класса такого никто делать не будет.

Но вам проще сигнал finished в азбуке искать и финдреплейсы для QString клепать. Понимаю, для этого думать особо не нужно. Улыбающийся
К сожалению, это уже особо никому не интересно, скорее всего поэтому:
а другого вообще как ветром сдуло Улыбающийся

Выходит вся ота "грамотность" - чисто понты, пролистать и попытаться запомнить как можно больше.
Вся ваша "грамотность" это чисто понты. Все правильно вы говорите.
Вы не можете найти элементарных решений, а виноваты все вокруг. Сплошные  комплексы. Улыбающийся
« Последнее редактирование: Ноябрь 02, 2013, 18:01 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Ноябрь 02, 2013, 21:15 »

Old, ну чего Вы разоряетесь и переходите на личности? Я же не виноват что Ваш пример, оказывается, "ненастоящий" Улыбающийся Если std так хорош, то чего же для простейшей вещи Вы привлекли буст, а поверх еще и неудачный велосипед? Спасибо конечно что потратили время, но ей-богу, на голом API платформы выходит куда проще. Чего же Вы пытаетесь меня стыдить незнанием std, если на деле выясняется что сами-то знаете это место "примерно в мою силу"?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #40 : Ноябрь 02, 2013, 21:32 »

Я же не виноват что Ваш пример, оказывается, "ненастоящий" Улыбающийся
Он не "настоящий" и лишен всяких обвесов, только для того, что бы была понятна суть. Улыбающийся
И показывает, насколько просто решается ваша "проблема", до чего вы сами додуматься не смогли.

Если std так хорош, то чего же для простейшей вещи Вы привлекли буст,
Потому, что новый стандарт только приняли, а бустом я пользуюсь уже многие годы. Мне было проще показать с его помощью. Хотя там для показания самой идеи ни std, ни boost и не нужен. Улыбающийся

а поверх еще и неудачный велосипед?
Демонстрация же, ну. Пример. Улыбающийся
А так да, отдельные нитки на каждый чих запускать не комильфо, есть более удачные решения. Да. Но вам оно не нужно, не финдреплейс же. Улыбающийся

на голом API платформы выходит куда проще.
Где код на голом API? Или забыли, или просто код перешел по наследству, а что там и как вы не знаете. Прошу исполнить. Улыбающийся

Только сдается мне, что пока какой нибудь новичок новую тему про финдреплейс не откроет, кода мы от вас не увидим. Улыбающийся
Это на в букваре про сигналы читать про библиотеку, где все за вас уже сделали. Улыбающийся
« Последнее редактирование: Ноябрь 02, 2013, 21:34 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #41 : Ноябрь 02, 2013, 22:16 »

Igors
Поддержка многопоточности в std пришла из boost'а (boost - это как некий полигон для стандарта) + ко всему прочему в c++11 появилась новая модель памяти.. Вот одна из цикла статей на эту тему: http://scrutator.me/post/2012/08/28/parallel-world-p3.aspx 

Те средства, что предоставляет сейчас для работы с многопоточностью стандартная библиотека или boost, оттачивались временем и далеко не дилетантами в этой области..  Если бы это было не перспективно, не удобно и не эффективно, это бы не прижилось ни в boost'е и не в std.

Но для вас, конечно же, это всё не аргумент..  И boost и сандартная библиотека - это плод чисто теоретиков от программирования) 
Куда уж им до "реальных" задач?) 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #42 : Ноябрь 02, 2013, 22:24 »

Вот одна из цикла статей на эту тему: http://scrutator.me/post/2012/08/28/parallel-world-p3.aspx 
Скукатень, ни слова про финдреплейс для QString и где finished? Где? Очередные бредни зубрежников-непрофессионалов. Улыбающийся

Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #43 : Ноябрь 02, 2013, 22:49 »

Вот одна из цикла статей на эту тему: http://scrutator.me/post/2012/08/28/parallel-world-p3.aspx 
Скукатень, ни слова про финдреплейс для QString и где finished? Где? Очередные бредни зубрежников-непрофессионалов. Улыбающийся
Смеющийся Ну да.. да.. Да, не всем дано проникнуться в образ мышления великого практика) Блоху от "практического программирования" подковать - это вам ни в boost  и во всякие сомнительные околоплюсовые статьи вникать, написанные хрен знает кем..) и хз знает для кого) И вообще..)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #44 : Ноябрь 03, 2013, 10:46 »

+ ко всему прочему в c++11 появилась новая модель памяти.. Вот одна из цикла статей на эту тему: http://scrutator.me/post/2012/08/28/parallel-world-p3.aspx
А Вы пытались хоть как-то осмыслить эту статью? Дочитайте до слов "компилятор имеет полное право". Оказывается если мы присваиваем член структуры, он скопирует всю, изменит член в локальной копии и потом всю присвоит!!! Да это же чушь собачья. Однако Вы осторожно молчите, и длиннющая лапша свисает с Ваших ушей  Улыбающийся

Те средства, что предоставляет сейчас для работы с многопоточностью стандартная библиотека или boost, оттачивались временем и далеко не дилетантами в этой области..  Если бы это было не перспективно, не удобно и не эффективно, это бы не прижилось ни в boost'е и не в std.
С этим соображением здравого смысла никто не спорит. Острой необходимости в std нет, каждый использует то что знает. К сожалению, получается разнобой. Вот что я скажу др человеку работающему над проектом? Ставь tbb? Или "вот наша либа, пользуй ее"? Это не смертельно, но вызывает ненужные заботы. А с std таких проблем не возникает, может это его главное достоинство.

Ну так и показываем как же это в std. Был задан абсолютно безобидный и естественный вопрос - как пощупать нитку что она работает? Чего Вы так раздражаетесь. кто же виноват что Ваш запас прочитанных знаний уже иссяк на первом же вопросе?  Улыбающийся
Записан
Страниц: 1 2 [3] 4 5   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.159 секунд. Запросов: 23.