Абстрактная фабрика
Получается примерно так:
Абстрактный поток:
public:
explicit Thread(int id);
Thread(const Thread&)=delete;
Thread()=delete;
Thread(const Thread&&)=delete;
virtual void start()=0;
virtual void stop()=0;
virtual ~Thread(){}
protected:
unique_ptr<int> m_id;
unique_ptr<atomic<bool>> m_stopflag;
unique_ptr<std::thread> m_thread;
//virtual void run()=0;
};
{
public:
Worker(const Worker&)=delete;
Worker(Worker&&)=delete;
Worker()=delete;
Worker(int id);
void start();
void stop();
virtual ~Worker();
protected:
virtual void run()=0;
};
Пока что использую так:
{
public:
Printer(int id, atomic<int>& val): Worker(id), m_val(val)
{
}
protected:
atomic<int>& m_val;
void run()
{
while(m_stopflag->load())
{
cout << m_val.load() << endl;
this_thread::sleep_for(std::chrono::milliseconds(200));
}
}
};
Использование в main():
atomic<int> ai;
atomic_init(&ai, 0);
unique_ptr<Worker> inc(new Incrementer(1, ai));
unique_ptr<Worker> dcr(new Decrementer(2, ai));
unique_ptr<Worker> prt(new Printer(3, ai));
inc->start();
dcr->start();
prt->start();
//...
Заранее спасибо!
- Я не профи в С#. Но могли бы вы сказать, что значит "=delete;" в строке: Thread(const Thread&)=delete; ? от Charley, 29 июля 2017 года
Ибо ну наделали вы активных объектов, ок. А для чего?
Запросы обрабатывать? Ну завалят вас запросами, наплодите вы потоков, машина ляжет...
Это мы еще не говорим о том что синхронизировать эти потоки вы ляжете.
Ибо ну наделали вы активных объектов, ок. А для чего?
Запросы обрабатывать? Ну завалят вас запросами, наплодите вы потоков, машина ляжет...
Это мы еще не говорим о том что синхронизировать эти потоки вы ляжете.
Конкретно я решаю задачу изучения паттернов, а такой пример показался мне понятным, поэтому я и стал его реализовывать. Возможно, эти потоки будут параллельно обрабатывать данные, не мешая друг другу. Простые параллельные вычисления в несколько тысяч потоков (напр. сумма элементов большого массива) производятся почти мгновенно, даже несмотря на накладные расходы, связанные с созданием и переключением потоков. А с чего машине лечь? У нее есть ограничение на число потоков. Да, синхронизация будет сильно портить жизнь, но все же я пока все еще хочу довести этот хелловорлд до ума.
Конкретно я решаю задачу изучения паттернов, а такой пример показался мне понятным, поэтому я и стал его реализовывать. Возможно, эти потоки будут параллельно обрабатывать данные, не мешая друг другу. Простые параллельные вычисления в несколько тысяч потоков (напр. сумма элементов большого массива) производятся почти мгновенно, даже несмотря на накладные расходы, связанные с созданием и переключением потоков. А с чего машине лечь? У нее есть ограничение на число потоков. Да, синхронизация будет сильно портить жизнь, но все же я пока все еще хочу довести этот хелловорлд до ума.
Т.н. "паттерны" бесполезны, особенно для решения абстрактных задач.
А машина ляжет потому что планирование и диспетчеризация потоков - вещи не бесплатные.
PS: Но кого сейчас волнуют такие мелочи как планирование, диспетчеризация и прочая мутная шняга...
Т.н. "паттерны" бесполезны, особенно для решения абстрактных задач.
А машина ляжет потому что планирование и диспетчеризация потоков - вещи не бесплатные.
Есть у меня чуйка, что не все с этим согласятся, однако, каждый первый работодатель требует знаний этой темы. Лично мной это воспринимается как лишняя груда кода, но я позже, возможно, войду во вкус.)
Сегодня буду пытаться повесить машину.-)
И все-таки как же перегрузить виртуальный метод, чтобы в разных наследниках были разные аргументы? Безотносительно к моему коду. Я уже подумываю, не передавать ли vector<std::any> параметром или вроде того
Может быть, вы заметили, что это C++. Эти строчки нужны для указания, что данные конструкторы вызывать нельзя. Хотя в данном случае у меня определен конструктор с одним аргументом, соответственно, эти конструкторы автоматически отваливаются. Но это для ясности.
Ну завалят вас запросами, наплодите вы потоков, машина ляжет...
Это мы еще не говорим о том что синхронизировать эти потоки вы ляжете.
Честно пытался повесить если не систему, то хотя бы приложение. Взял венду. Пытался создать 100000 потоков и не дождался их создания, ибо при ~45000 процесс ест 1,5 гига (всего 12) памяти и новые потоки создаются жутко медленно (по 10-15 в секунду). На работу остальной системы никак не повлияло. Единственные проблемы возникли с диспетчеризацией, потому что она отвратительна. Даже при 100 потоках, многие из них вообще не получают времени (конечно, если оставить это дело на пару суток, м/б диспетчер добрался бы до всех, однако, в течение нескольких минут дела довольно плохо). Наверное, придется писать менеджер, который будет запускать потоки по очереди. Короче говоря, положить машину не получается.
Ну завалят вас запросами, наплодите вы потоков, машина ляжет...
Это мы еще не говорим о том что синхронизировать эти потоки вы ляжете.
Честно пытался повесить если не систему, то хотя бы приложение. Взял венду. Пытался создать 100000 потоков и не дождался их создания, ибо при ~45000 процесс ест 1,5 гига (всего 12) памяти и новые потоки создаются жутко медленно (по 10-15 в секунду). На работу остальной системы никак не повлияло. Единственные проблемы возникли с диспетчеризацией, потому что она отвратительна. Даже при 100 потоках, многие из них вообще не получают времени (конечно, если оставить это дело на пару суток, м/б диспетчер добрался бы до всех, однако, в течение нескольких минут дела довольно плохо). Наверное, придется писать менеджер, который будет запускать потоки по очереди. Короче говоря, положить машину не получается.
Пара вопросов из зала.
Потоки хоть что-то делали или тупо спали?
Ну и самое интересное: а для чего вам потоки? чего вы с их помощью пытаетесь добиться?
PS: Не влиять ни на что оно не может ибо в NT планировка system-wide.
Пара вопросов из зала.
Потоки хоть что-то делали или тупо спали?
Ну и самое интересное: а для чего вам потоки? чего вы с их помощью пытаетесь добиться?
PS: Не влиять ни на что оно не может ибо в NT планировка system-wide.
• На самом деле я просто учусь тому, чего за свою АСУшную практику применять не приходилось. Сейчас есть время и желание отойти от АСУ ТП в сторону десктопа или системного програмирования под Линукс (на си, соответственно). Пока занимаюсь исключительно ООП и C++. Новые стандарты, boost по праздникам и т.д.
• Потоки у меня сортировали вектор интов (один на всех), синхронизировались мьютексом. Код процедуры потока:
{
mtx.lock();
reverse(m_array.begin(), m_array.end());
//cout << "id: " << *m_id << "t - tsort()" << endl;
sort(m_array.begin(), m_array.end());
mtx.unlock();
//std::this_thread::yield();
}
PS: Мой вам совет, не лезьте в "системное", оно сдохло и уже даже не воняет. Смотрите лучше в сторону иных областей.
PS: Мой вам совет, не лезьте в "системное", оно сдохло и уже даже не воняет. Смотрите лучше в сторону иных областей.
Дал каждому потоку свой вектор и убрал блкировки. Проц загрузился на 100%, памяти 3Гб и больше ~7000 потоков как-то не создается. Система подтормаживает, но работает, а новые потоки не создаются больше. Можно считать на этом месте, что софтина сдохла, но система со скрипом, но работает:)
ЗЫ: Не за идею же работаем (хотя всякое бывает. я за идею наработался, теперь хочу за деньги). Пусть будет дохлое, если будут достаточно платить - отчего бы не поработать. Вакансии редко, но бывают вроде создателя модулей ядра. Но в общем и целом, конечно, думаю, что стоит закончить с этим и заняться Qt, например. Можно даже отвалить 50 рублей в Специалист, чтобы за 8 дней популярно объяснили что к чему. Плюс бумажка.
Трудно не согласиться:)