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

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

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

Сообщений: 2095



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

Цитировать
А Вы пытались хоть как-то осмыслить эту статью? Дочитайте до слов "компилятор имеет полное право". Оказывается если мы присваиваем член структуры, он скопирует всю, изменит член в локальной копии и потом всю присвоит!!!

Я то как раз и прочёл и осмыслил.. А вот вы похоже остановились лишь на первом же пункте "Базовая модель".
То о чём Вы сейчас написали имело место в старом 03 стандарте, в котором нет многозадачности..
Пример, что приведён в той статье как раз демонстрирует, одну из причин по которой в новом 11 стандарте пришла на смену новая модель памяти..

Цитировать
Ну так и показываем как же это в std. Был задан абсолютно безобидный и естественный вопрос - как пощупать нитку что она работает? Чего Вы так раздражаетесь. кто же виноват что Ваш запас прочитанных знаний уже иссяк на первом же вопросе?

Да просто Ваши вопросы из ряда: У слона длинный хобот и большие уши - почему он не летает?) 
Записан

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

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

Сообщений: 4350



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

Ну так и показываем как же это в std. Был задан абсолютно безобидный и естественный вопрос - как пощупать нитку что она работает? Чего Вы так раздражаетесь. кто же виноват что Ваш запас прочитанных знаний уже иссяк на первом же вопросе?  Улыбающийся
А вам уже все показали, пример из варианта boost в вариант std переделывается за пять минут, просто небольшими косметическими изменениями пространства имен и подключаемых файлов. Если бы вы хотели это узнать, то давно бы переделали его сами, а если бы у вас что-то не получалось, то вам бы уже давно помогли. Улыбающийся
Но вам оно не надо, или вы хотите получить готовое решение не подумав. Ну хотите дальше.

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

Все как всегдап, сплошное бла-бла-бла и демонстрация Hello world. Скучно. Ждите новичков и показывайте им свой "проффесионализм". Х:)
 
« Последнее редактирование: Ноябрь 03, 2013, 11:43 от Old » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Ну так и показываем как же это в std. Был задан абсолютно безобидный и естественный вопрос - как пощупать нитку что она работает? Чего Вы так раздражаетесь. кто же виноват что Ваш запас прочитанных знаний уже иссяк на первом же вопросе?

Вот, специально для Вас реализация std (Хотя Old вам уже приводил пример, не знаю чего вам ещё надо):

Код
C++ (Qt)
#include <iostream>
#include <atomic>
#include <memory>
#include <thread>
 
template <class Function>
class runable
{
public:
   typedef std::atomic_bool atomic_bool;
 
   runable(Function && f, atomic_bool & finished) : m_f(f), m_finished(finished) {}
   void operator()() const {
       m_f();
       m_finished = true;
   }
private:
   Function m_f;
   atomic_bool & m_finished;
 
};
 
class thread
{
public:
   typedef std::atomic_bool atomic_bool;
 
   template <class Function>
   thread(Function && f) : m_finished(false) {
      m_thread_ptr =  std::make_shared<std::thread>(runable<Function>(f, m_finished));
   }
 
   void join() { m_thread_ptr->join(); }
 
   bool fnished() const { return m_finished; }
private:
   atomic_bool m_finished;
   std::shared_ptr<std::thread> m_thread_ptr;
};
 
 
void func() {
   std::cout << " Child thread-id = " << std::this_thread::get_id() << std::endl;
}
 
int main()
{
   std::cout << "Main thread-id = " << std::this_thread::get_id() << std::endl;
 
   thread th(func);
 
   while (!th.fnished()) {}
 
   std::cout << "finished!\n";
 
   th.join();
   return 0;
}
 
Записан

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

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

Сообщений: 4350



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

Вот, специально для Вас реализация std (Хотя Old вам уже приводил пример, не знаю чего вам ещё надо):
Весь трагизм ситуации в том, что мы сейчас "плохому учим". Улыбающийся
Мы породили совершенно ненужную сущность и демонстрируем реализацию совершенно бесполезного действия, которое вряд-ли когда понадобиться в реальном проекте.
В боевых условиях, если мне понадобиться дождаться завершения одного действия, что бы выполнить другое, я воспользуюсь другим более эффективным средством для этого.
Но что бы наш "профи" понял этот шайтан-прием, приходится идти на это. Улыбающийся
« Последнее редактирование: Ноябрь 03, 2013, 13:21 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Я то как раз и прочёл и осмыслил.. А вот вы похоже остановились лишь на первом же пункте "Базовая модель".
То о чём Вы сейчас написали имело место в старом 03 стандарте, в котором нет многозадачности..
Сейчас я занят с пытоном, когда буду посвободнее - создам тему где это обсудим. Не возражаете?

Код
C++ (Qt)
   void operator()() const {
       m_f();
       m_finished = true;
   }
 
Объясните что это за байда и зачем она нужна. Да, и если Вы делаете прокладку (runnable) то как ее сделать для разных пользоваткльских ф-ций (с разеыми параметрами)? Спасибо

Мы породили совершенно ненужную сущность и демонстрируем реализацию совершенно бесполезного действия, которое вряд-ли когда понадобиться в реальном проекте.
В боевых условиях, если мне понадобиться дождаться завершения одного действия, что бы выполнить другое, я воспользуюсь другим более эффективным средством для этого.
Но что бы наш "профи" понял этот шайтан-прием, приходится идти на это. Улыбающийся
Этим приемом я владею не хуже Вас и детских ошибок не допускаю Улыбающийся Только вот мне не очень интересно тратить время на изучение, а потом еще и класс создавай, и флажок заводи  Плачущий Хочется "попастись", попользоваться готовым (если уж изучал). Это нормальное шкурное желание, а здесь (std) что-то не густо.

Насчет того что никогда не понадобится это Вы загнули. Ну хорошо, показываем а как же мне получить завершение по асинхронке - callback или там future какой (ну все, хана, щас затопчут сынтаксысом  Улыбающийся)
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #50 : Ноябрь 04, 2013, 14:58 »

Цитировать
Сейчас я занят с пытоном, когда буду посвободнее - создам тему где это обсудим. Не возражаете?
Да пожалуйста, только если вопросы будете корректные ставить..

Цитировать
Объясните что это за байда и зачем она нужна.
А Вы сами как думаете?

Цитировать
Да, и если Вы делаете прокладку (runnable) то как ее сделать для разных пользоваткльских ф-ций (с разеыми параметрами)? Спасибо
Точно так же как это сделано в std::thread.. Можно вообще ничего не менять в runable, передавая в него любую функцию с любым числом параметров.. но.. Но для этого нужно знать что такое и как работает std::bind.. Понимаю - не вариант для Вас)

Записан

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

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

Сообщений: 11445


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

Да, и Ваш пример не компилится

Цитировать
consoleapplication1.cpp(29): error C2664: 'std::atomic_bool::atomic_bool(const std::atomic_bool &)' : cannot convert parameter 1 from 'bool' to 'const std::atomic_bool &'
1>          Reason: cannot convert from 'bool' to 'const std::atomic_bool'
1>          No constructor could take the source type, or constructor overload resolution was ambiguous
1>          c:\users\igor\documents\visual studio 2012\projects\consoleapplication1\consoleapplication1\consoleapplication1.cpp(50) : see reference to function template instantiation 'thread::thread<void(__cdecl &)(void)>(Function)' being compiled
1>          with
1>          [
1>              Function=void (__cdecl &)(void)
1>          ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Этим приемом я владею не хуже Вас и детских ошибок не допускаю Улыбающийся
Не придумывайте, вы до сих пор не знаете как это сделать, иначе мы бы увидели ваше чудо решение уже давно.
Повторяю, то что предлагаете вы (перенести присвоение в start и переименовать переменную) - ничего не исправляет!
Устанавливать переменную нужно там, где это делаю я, нужно просто добавить некоторые средства синхронизации, и все заработает как надо. Но у вас не получается....

Только вот мне не очень интересно тратить время на изучение, а потом еще и класс создавай, и флажок заводи
Конечно - это идиотизм, так никто не делает, так же как и не узнает завершилась ли нить или нет. Улыбающийся Это идиотское решение для вашей идиотской задачи. Все нормально.

vХочется "попастись", попользоваться готовым (если уж изучал).
Так а почему не пользуетесь? Вы сейчас изобрели кастрированный QThreadPool + QRunnable. Почему вы не воспользовались готовым? Еще не изучили? А на базе этого решения и строятся QtConcurent.

Это нормальное шкурное желание, а здесь (std) что-то не густо.
Конечно не густо, вы уставились на низкоуровневый std::thread и хотите от него сигнала finished. Он так не умеет.
Нужны другие средства, на его основе.

Запускать одинарные потоки можно если в программа ИНОГДА нужно сделать какую-то асинхронную операцию (или в софте для секретарш), если программа активно работает с потоками, то нужно создавать пул потоков, в котором они запускаются один раз и выполняют появляющиеся задачи. Кстати в Qt так и сделано.
Я использую свой пул потоков, основанный на бусте, там я могу запустить любую функцию или любой метод любого объекта в отделном потоке и по завершению получить от него результат. Никаких ограничений не на количество длинных операций, ни на их длительность нет.
Наследоваться не от чего не надо, никаких QRunnable (и самодельные интерфейсов), там нет и в помине.
Можете вызвать функцию непосредственно, а можете ее же в отдельной нитке, делается это в одну строку.

Насчет того что никогда не понадобится это Вы загнули. Ну хорошо, показываем а как же мне получить завершение по асинхронке - callback или там future какой (ну все, хана, щас затопчут сынтаксысом  Улыбающийся)
Мне никогда не понадобиться.
А синтаксис очень прост:
Код
C++ (Qt)
void setvar::execute( connection_ptr c )
{
       calc::longops::instance()->start(
               boost::bind( &recalc, c->get_context(), boost::ref( m_vars ) ),    // Запустить recalc в отдельной нитке
               boost::bind( &setvar::send_reply, shared_from_this(), c, _1 )      // После завершения выполнения вызвать send_reply.
              // В качестве аргумента send_reply будет передан результат выполнения recalc.
       );
}
 
Понимаю, для вас сынтаксис сложноват, но уж такая у нас работа.
« Последнее редактирование: Ноябрь 04, 2013, 15:13 от Old » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Ну хорошо, показываем а как же мне получить завершение по асинхронке - callback или там future какой (ну все, хана, щас затопчут сынтаксысом  Улыбающийся)
И да, вам бы с этим делом сначала в Qt разобраться, там и азбука получше, да и сделано там попроще, сильно C++ знать не надо. Все как вы любите. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Не придумывайте, вы до сих пор не знаете как это сделать, иначе мы бы увидели ваше чудо решение уже давно.
Повторяю, то что предлагаете вы (перенести присвоение в start и переименовать переменную) - ничего не исправляет!
Устанавливать переменную нужно там, где это делаю я, ...
Классика советского кино
Цитировать
Ну ты азартен, Парамоша!
С Вами хорошо в карты играть  Улыбающийся

Код
C++ (Qt)
void setvar::execute( connection_ptr c )
{
       calc::longops::instance()->start(
               boost::bind( &recalc, c->get_context(), boost::ref( m_vars ) ),    // Запустить recalc в отдельной нитке
               boost::bind( &setvar::send_reply, shared_from_this(), c, _1 )      // После завершения выполнения вызвать send_reply.
              // В качестве аргумента send_reply будет передан результат выполнения recalc.
       );
}
 
Никто и не сомневался что в бусте это есть. Но мы говорим об std (голый стандарт). Поэтому пожалуйста по теме
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

С Вами хорошо в карты играть  Улыбающийся
Со мной блефовать будет сложно. Улыбающийся Не получиться в "уши надуть"  про свои якобы умения. Подмигивающий

Никто и не сомневался что в бусте это есть. Но мы говорим об std (голый стандарт). Поэтому пожалуйста по теме
Так в std уже bind есть, можно вместо boost:: написать std:: Неужели это так сложно для вас?
Под "основанный на boost" имеется ввиду, что для реализации используются средства boost, т.к. раньше нужные мне вещи были только там.
Внутри у моего решения, только потоки, средства синхронизации, std::list + std::queue, function, ну и bind. И конечно умные указатели. Все это есть в C++11, то есть в std.

Сел переделал решение для std, теперь и без буста. Улыбающийся

« Последнее редактирование: Ноябрь 04, 2013, 17:21 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Внутри у моего решения, только потоки, средства синхронизации, std::list + std::queue, function, ну и bind. И конечно умные указатели. Все это есть в C++11, то есть в std.

Сел переделал решение для std, теперь и без буста. Улыбающийся
Так а где же оно?  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Так а где же оно?  Улыбающийся
У меня в директории thread_pool. Улыбающийся

Что бы оценить размер этой шайтан-штуки привожу небольшой скриншотик (120 строк кода вместе с пустыми строками). Улыбающийся
При конструировании стартует/при разрушении останавливает нитки, их количество можно задать руками, а можно оставить ей, тогда запуститься std::thread::hardware_concurrency() ниток. Устанавливает задачи в очередь, выполняет и сообщает кому велено результат. Улыбающийся
« Последнее редактирование: Ноябрь 05, 2013, 21:45 от Old » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Вот одна из цикла статей на эту тему: http://scrutator.me/post/2012/08/28/parallel-world-p3.aspx 
m_ax, хотел создать новую тему чтобы обсудить эту статью (как и обещал). Но почему-то первоисточник удален (404). Может перенесли в др место? (хотя скорее всего разобрались что фуфло и замочили чтобы не позориться  Улыбающийся)
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

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

Что за фантазии?) Ничего не удалён) У меня всё кликабельно.
Записан

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

Arch Linux Plasma 5
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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