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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Запуск потоков по условию C++ Qt (QMutex) : Май 02, 2020, 09:44
Буду пытаться разобраться, как оно работает
Ну бум надеяться что препод не спросит "а мутекс-то зачем?". Да, все будет работать и без него. Но в задании ясно сказано "с помощью мутексов" (а не чего-то еще), ну значит используем. Печать "Started" добавьте (я забыл)
Started добавил. Преподаватель принял работу. Ещё раз большое спасибо !!!
2  Qt / Вопросы новичков / Re: Запуск потоков по условию C++ Qt (QMutex) : Май 01, 2020, 13:11
Проще написать (аттач) чем объяснять
Спасибо большое  Смеющийся Смеющийся Смеющийся
Буду пытаться разобраться, как оно работает
3  Qt / Вопросы новичков / Запуск потоков по условию C++ Qt (QMutex) : Апрель 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();
}
Страниц: [1]

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