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