Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ILS_FIST от Апрель 30, 2020, 14:08



Название: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ILS_FIST от Апрель 30, 2020, 14:08
Всем привет! :D
Столкнулся с проблемой при запуске потоков по условию.
Вот сама задача.
"Создать программу, которая запускает потоки, каждый из которых выводит свою букву (A,B, C, D) 10 раз с интервалом примерно в 0.5 секунд. Задержку реализовать за счёт процессорных вычислений.

С помощью мьютексов реализовать следующую синхронизацию:
1. "B" должна начать выводиться только после вывода 4 букв "А" и двух букв "С".
2. "D" только после вывода хотя бы одной буквы "B".
3. Вывести сообщение о том, что все потоки стартовали (начали выводить свои буквы).
4. Вывести сообщения о полном завершении работы всех потоков."

Создал потоки, задал им приоритет. У меня не получается запускать другие потоки по условию используя мьютекс.
Ставлю мьютексы, но работает не так, как надо. ???
Вот, что у меня пока вышло.
Пожалуйста, помогите.

Код:
#include <QCoreApplication>
#include <QThread>
#include <QMutex>
#define N 10

QMutex mA;
QMutex mB;
QMutex mC;
QMutex mD;

//Функция загружающая CPU
double f() {

  double x;
  for (double k = 0; k < 110; k += 0.00005)
    x += k * sin(k) * exp(k);
  return x;
}

//Функции, которые будут выполняться в потоках и выводить соответствующие буквы в цикле
void A() {
  mA.lock();
  for (int i = 1; i <= N; i++) {
    f();
    putchar('A');
    if (i == 4) {
      mA.unlock();
    }
  }
}

void C() {
  mC.lock();
  for (int i = 1; i <= N; i++) {
    f();
    putchar('C');
    if (i == 2) {
      mC.lock();
    }
  }
}

void B() {
  mA.lock();
  for (int i = 1; i <= N; i++) {
    f();
    putchar('B');
    if (i == 1) {
      mB.lock();
    }
  }
}

void D() {
  mA.lock();
  for (int i = 1; i <= N; i++) {
    f();
    putchar('D');
  }
  mD.lock();
}

int main(int argc, char * argv[]) {
  QCoreApplication a(argc, argv);

  QThread pA;
  QObject::connect( & pA, & QThread::started, A);

  QThread pC;
  QObject::connect( & pC, & QThread::started, C);

  QThread pB;
  QObject::connect( & pB, & QThread::started, B);

  QThread pD;
  QObject::connect( & pD, & QThread::started, D);

  pA.start(QThread::TimeCriticalPriority);
  pB.start(QThread::TimeCriticalPriority);
  pC.start(QThread::TimeCriticalPriority);
  pD.start(QThread::TimeCriticalPriority);
  return a.exec();
}


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Апрель 30, 2020, 16:56
Проще написать (аттач) чем объяснять


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Old от Апрель 30, 2020, 18:37
Проще написать (аттач) чем объяснять
ТС так тоже проще, взял и сдал лабораторку. :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Апрель 30, 2020, 18:43
ТС так тоже проще, взял и сдал лабораторку. :)

Надеюсь оценку потом скажет :).


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 01, 2020, 11:15
Надеюсь оценку потом скажет :).
А что не нравится эстету ?


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: kuzulis от Май 01, 2020, 13:09
Прикольно если парень получит двойку ))


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ILS_FIST от Май 01, 2020, 13:11
Проще написать (аттач) чем объяснять
Спасибо большое  ;D ;D ;D
Буду пытаться разобраться, как оно работает


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 01, 2020, 13:26
Прикольно если парень получит двойку ))

Прикольно, если парень получит пятерку ;D.


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 01, 2020, 15:52
Буду пытаться разобраться, как оно работает
Ну бум надеяться что препод не спросит "а мутекс-то зачем?". Да, все будет работать и без него. Но в задании ясно сказано "с помощью мутексов" (а не чего-то еще), ну значит используем. Печать "Started" добавьте (я забыл)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 01, 2020, 17:15
А что не нравится эстету ?

Эстету не нравится, что опять все обо всех знают, всё в одной куче, и глобальные переменные (в частности done). И к самому заданию есть вопросы. Но какое задание - такое и решение. Если оно работает, чего ещё желать от лабораторки :).


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 02, 2020, 09:07
Эстету не нравится, что опять все обо всех знают, всё в одной куче, и глобальные переменные (в частности done). И к самому заданию есть вопросы. Но какое задание - такое и решение. Если оно работает, чего ещё желать от лабораторки :).
Вы опять становитесь на путь бесконечного (но бесплодного) "выяснения" :) Да, задание небезупречно, но его надо выполнять. И даже если есть свобода постановки (недавно постил такую задачу) "выяснить все" не удается, сам подход не конструктивен.

"Все обо всех" и "глобальные" = плохо. Ну собсно это тот же done, никаких др "всех" нет. Да, можно поместить его в некий класс-менеджер, нарисовать его методы, дать ниткам (хитрый) указатель на него и.т.п, но .. чем оправдана такая городушка? Да ровным счетом ничем, поэтому и городить ее не стоит  :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ILS_FIST от Май 02, 2020, 09:44
Буду пытаться разобраться, как оно работает
Ну бум надеяться что препод не спросит "а мутекс-то зачем?". Да, все будет работать и без него. Но в задании ясно сказано "с помощью мутексов" (а не чего-то еще), ну значит используем. Печать "Started" добавьте (я забыл)
Started добавил. Преподаватель принял работу. Ещё раз большое спасибо !!!


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 02, 2020, 13:05
Вы опять становитесь на путь бесконечного (но бесплодного) "выяснения" :) Да, задание небезупречно, но его надо выполнять. И даже если есть свобода постановки (недавно постил такую задачу) "выяснить все" не удается, сам подход не конструктивен.

А если предположить, что задание составлял человек скорее хитрый и коварный, нежели глупый? :) Вот первый пункт:
Цитировать
1. "B" должна начать выводиться только после вывода 4 букв "А" и двух букв "С".

В Вашем решении "B" начинает выводиться, когда может напечататься уже больше двух "С". Можно ли более широко трактовать это условие? Ведь сказано "только после вывода 4 букв "А" и двух букв "С"", а не "после вывода 4 букв "А" и хотя бы двух букв "С"", по аналогии со вторым пунктом.

Цитировать
...потоки, каждый из которых выводит свою букву (A,B, C, D) 10 раз с интервалом примерно в 0.5 секунд. Задержку реализовать за счёт процессорных вычислений.

У Вас потоки B и D начинают греть атмосферу процессором ещё до вывода своих букв. A и C, кстати, тоже. Непорядок?

"Все обо всех" и "глобальные" = плохо. Ну собсно это тот же done, никаких др "всех" нет. Да, можно поместить его в некий класс-менеджер, нарисовать его методы, дать ниткам (хитрый) указатель на него и.т.п, но .. чем оправдана такая городушка? Да ровным счетом ничем, поэтому и городить ее не стоит  :)

Действительно, зачем городить? Фигак-фигак и в продакшен - наше всё :).


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 02, 2020, 15:43
А если предположить, что задание составлял человек скорее хитрый и коварный, нежели глупый? :)
:)

Действительно, зачем городить? Фигак-фигак и в продакшен - наше всё :).
Ну в общем да :) KISS-прынцып никто не отменял. Предлагаю направить Ваше желание попридираться в нужное русло. Вот задачка (http://www.prog.org.ru/index.php?topic=32673.msg241671#msg241671) где оно было бы весьма желательно. Я ее уже "сделал", но увы, мое решение страдает серьезными недостатками. Хотите сразу скажу какими, хотите сами предположите (это интересно). Свобода постановки здесь есть - пожалуйста, планируйте. А то "выискивать недочеты" все мастера  :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 02, 2020, 17:00
Ну в общем да :) KISS-прынцып никто не отменял. Предлагаю направить Ваше желание попридираться в нужное русло. Вот задачка (http://www.prog.org.ru/index.php?topic=32673.msg241671#msg241671) где оно было бы весьма желательно. Я ее уже "сделал", но увы, мое решение страдает серьезными недостатками. Хотите сразу скажу какими, хотите сами предположите (это интересно). Свобода постановки здесь есть - пожалуйста, планируйте. А то "выискивать недочеты" все мастера  :)

Нет, чайники двигать мне сейчас совсем не интересно. KISS :).


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 03, 2020, 08:19
Нет, чайники двигать мне сейчас совсем не интересно. KISS :).
Знаю. Да, энергии масса, и конечно возникает мысль "эх, ее бы на доброе дело" - ан нет. Вот месить какую-нить финтифлюшку будут до посинения, а работать - нееет. Впрочем это давно описано в сказке "властелин колец".


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 04, 2020, 11:57
Знаю. Да, энергии масса, и конечно возникает мысль "эх, ее бы на доброе дело" - ан нет. Вот месить какую-нить финтифлюшку будут до посинения, а работать - нееет. Впрочем это давно описано в сказке "властелин колец".

А во "Властелине колец" что уже не так делали? Нужно было не самим к Ородруину топать, а послать армию чайников, чтобы они Саурона кипятком залили? Вы над этим сейчас работаете? :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 06, 2020, 11:05
А во "Властелине колец" что уже не так делали?
Там не раз подчеркивается громадная сила кольца, поэтому желание героев его как-то задействовать вполне понятно. Однако автор по сути утверждает что это невозможно, кольцо приносит только зло, и единственный верный путь - уничтожить его. Хмм... по-моему это спорно.

Аналогии с программированием/программистами прозрачны/очевидны. Человек осваивает столько что я себе и представить не в состоянии, багаж знаний огромен. Но вот выплывает скромная фича "носиком вперед", нормально сделать ее за неск дней, а то и меньше. И что же наш знаток? А ничего, полный ноль, глупо хихикает :) Оказывается придумать какой-то план/алгоритм, ответить за него и.т.п. - ничего этого он не умеет. В его "базе знаний" такого нет (плохая задача!) - и все, два дня поголодал, морозцем ударило - он и лапки кверху. Ну и нафиг он нужен? Какая польза от его обширных познаний?


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Авварон от Май 06, 2020, 11:38
Igors
Вам не приходило в голову, что нам не платят за то, чтобы мы двигали чайники носиками вперед и у лдей есть задачи поважнее\поинтереснее чем двигать чайники?


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Old от Май 06, 2020, 11:44
Igors
Вам не приходило в голову, что нам не платят за то, чтобы мы двигали чайники носиками вперед и у лдей есть задачи поважнее\поинтереснее чем двигать чайники?
Этого не может быть. Только та ерунда, которой занимается Igors - это самые важные, сложные и достойные задачи для настоящих программистов! И только он их решает! Все остальные, априори, занимаются всякой фигней, не заслуживающей внимания. :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Авварон от Май 06, 2020, 12:27
Old
Ну, справедливости ради, я как раз занимаюсь какой-то фигнёй :(


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Old от Май 06, 2020, 12:39
Old
Ну, справедливости ради, я как раз занимаюсь какой-то фигнёй :(
Здесь все занимаются какой-то фигней, ну кроме... властелина чайников. :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 06, 2020, 12:42
Аналогии с программированием/программистами прозрачны/очевидны. Человек осваивает столько что я себе и представить не в состоянии, багаж знаний огромен. Но вот выплывает скромная фича "носиком вперед", нормально сделать ее за неск дней, а то и меньше. И что же наш знаток? А ничего, полный ноль, глупо хихикает :) Оказывается придумать какой-то план/алгоритм, ответить за него и.т.п. - ничего этого он не умеет. В его "базе знаний" такого нет (плохая задача!) - и все, два дня поголодал, морозцем ударило - он и лапки кверху. Ну и нафиг он нужен? Какая польза от его обширных познаний?

Ага, а ещё хоббиты могли сразу на орлах к горе полететь, а не пешком до неё босиком шлёпать. Но орлы проявили несознательность... И нафиг они такие нужны? Какая польза от их обширных крыльев?


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 06, 2020, 12:46
Old
Ну, справедливости ради, я как раз занимаюсь какой-то фигнёй :(

Ну вот, уже фигнёй занимаетесь. Вам же не трудно дополнительно ещё одной фигнёй позаниматься :). Там делов-то на несколько дней всего. А то и меньше :).


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 06, 2020, 12:57
Здесь все занимаются какой-то фигней, ну кроме... властелина чайников. :)

Ну как "властелина"... Даже собственные чайники не хотят стройными рядами носиками вперёд ходить. Определённо, тут всё дело в кольце, а не в умениях хозяина. Вот было бы кольцо всечаянья, тогда всех бы чайниками покорил!


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Авварон от Май 06, 2020, 14:08
Что будет, если в чайник насыпать деревянных айтемов ???


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: ViTech от Май 06, 2020, 16:01
Что будет, если в чайник насыпать деревянных айтемов ???

Кватернион? Если я правильно СУТЬ уловил...


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 08, 2020, 12:12
Igors
Вам не приходило в голову, что нам не платят за то, чтобы мы двигали чайники носиками вперед и у лдей есть задачи поважнее\поинтереснее чем двигать чайники?
Не наблюдаю таких задач на этом форуме. Приведите хоть один пример.

Хотя справедливости ради надо сказать что лишь немногие задачи годятся для обсуждения на форуме. Подавляющее большинство требует спец подготовки/знаний, требовать которых от форумчан некорректно. А "носиком вперед" - это ж "легкий труд", на производстве такое поручают беременным, ну покидала уголек лопаткой на свежем воздухе. В самом деле - знания требуются в рамках школьного курса, тонны чужих исходников нет, постановка гибкая. Что не нравится ? Да, в букваре этого нет, так что теперь? Голова-то есть или как?


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Old от Май 08, 2020, 21:14
Не наблюдаю таких задач на этом форуме. Приведите хоть один пример.
Наивно полагать, что все обсуждают свои задачи на форуме. Еще большей наивностью является вера в то, что если участник не обсуждает здесь свои задач, то он ничем не занимается/занимается фигней. :)
Не все так зависят от форума... :)


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Igors от Май 12, 2020, 10:44
Что-то притих остряк-самоучка :) Ну все-таки как же так, человек обладает такой огромной "суммой знаний", а на рядовой задачке - полный конфуз. Наверное он с этим "не работал", вот если бы он занимался движками, физикой и.т.п. - вот тогда...

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


Название: Re: Запуск потоков по условию C++ Qt (QMutex)
Отправлено: Old от Май 12, 2020, 12:06
Что-то притих остряк-самоучка :) Ну все-таки как же так, человек обладает такой огромной "суммой знаний", а на рядовой задачке - полный конфуз.
И не говорите. Не хочет этот остряк-самоучка вашу работу делать. Вы его и так подкололи и эдак, а он все не ведется. Придется вам решать ее самостоятельно, как обычно через жопу. :)