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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Запуск потоков по условию C++ Qt (QMutex)  (Прочитано 9154 раз)
ILS_FIST
Новичок

Offline Offline

Сообщений: 3


Просмотр профиля
« : Апрель 30, 2020, 14:08 »

Всем привет! Веселый
Столкнулся с проблемой при запуске потоков по условию.
Вот сама задача.
"Создать программу, которая запускает потоки, каждый из которых выводит свою букву (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();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 30, 2020, 16:56 »

Проще написать (аттач) чем объяснять
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #2 : Апрель 30, 2020, 18:37 »

Проще написать (аттач) чем объяснять
ТС так тоже проще, взял и сдал лабораторку. Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #3 : Апрель 30, 2020, 18:43 »

ТС так тоже проще, взял и сдал лабораторку. Улыбающийся

Надеюсь оценку потом скажет Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 01, 2020, 11:15 »

Надеюсь оценку потом скажет Улыбающийся.
А что не нравится эстету ?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Май 01, 2020, 13:09 »

Прикольно если парень получит двойку ))
Записан

ArchLinux x86_64 / Win10 64 bit
ILS_FIST
Новичок

Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #6 : Май 01, 2020, 13:11 »

Проще написать (аттач) чем объяснять
Спасибо большое  Смеющийся Смеющийся Смеющийся
Буду пытаться разобраться, как оно работает
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #7 : Май 01, 2020, 13:26 »

Прикольно если парень получит двойку ))

Прикольно, если парень получит пятерку Смеющийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Май 01, 2020, 15:52 »

Буду пытаться разобраться, как оно работает
Ну бум надеяться что препод не спросит "а мутекс-то зачем?". Да, все будет работать и без него. Но в задании ясно сказано "с помощью мутексов" (а не чего-то еще), ну значит используем. Печать "Started" добавьте (я забыл)
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #9 : Май 01, 2020, 17:15 »

А что не нравится эстету ?

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

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Май 02, 2020, 09:07 »

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

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

Offline Offline

Сообщений: 3


Просмотр профиля
« Ответ #11 : Май 02, 2020, 09:44 »

Буду пытаться разобраться, как оно работает
Ну бум надеяться что препод не спросит "а мутекс-то зачем?". Да, все будет работать и без него. Но в задании ясно сказано "с помощью мутексов" (а не чего-то еще), ну значит используем. Печать "Started" добавьте (я забыл)
Started добавил. Преподаватель принял работу. Ещё раз большое спасибо !!!
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #12 : Май 02, 2020, 13:05 »

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

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

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

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

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

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

Действительно, зачем городить? Фигак-фигак и в продакшен - наше всё Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Май 02, 2020, 15:43 »

А если предположить, что задание составлял человек скорее хитрый и коварный, нежели глупый? Улыбающийся
Улыбающийся

Действительно, зачем городить? Фигак-фигак и в продакшен - наше всё Улыбающийся.
Ну в общем да Улыбающийся KISS-прынцып никто не отменял. Предлагаю направить Ваше желание попридираться в нужное русло. Вот задачка где оно было бы весьма желательно. Я ее уже "сделал", но увы, мое решение страдает серьезными недостатками. Хотите сразу скажу какими, хотите сами предположите (это интересно). Свобода постановки здесь есть - пожалуйста, планируйте. А то "выискивать недочеты" все мастера  Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #14 : Май 02, 2020, 17:00 »

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

Нет, чайники двигать мне сейчас совсем не интересно. KISS Улыбающийся.
Записан

Пока сам не сделаешь...
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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