Fix threads

This commit is contained in:
Robin Dietzel 2023-12-02 14:34:06 +01:00
parent 9c4dbf6dc6
commit 71fad746b3
4 changed files with 114 additions and 5 deletions

View File

@ -26,3 +26,4 @@ add_subdirectory(third-party/fmt)
# Include CMakeLists files from subdirs for specific tasks # Include CMakeLists files from subdirs for specific tasks
add_subdirectory(task1) add_subdirectory(task1)
add_subdirectory(task3)

View File

@ -7,14 +7,24 @@
}, },
"configurePresets": [ "configurePresets": [
{ {
"name": "task1@release", "name": "task@release",
"displayName": "Task1 Release build", "displayName": "Task Release build",
"description": "Builds the targets of task1 as release", "description": "Builds the target as release",
"generator": "Ninja", "generator": "Ninja",
"binaryDir": "${sourceDir}/.out/task1-release", "binaryDir": "${sourceDir}/.out/task-release",
"cacheVariables": { "cacheVariables": {
"CMAKE_BUILD_TYPE": "Release" "CMAKE_BUILD_TYPE": "Release"
} }
},
{
"name": "task@debug",
"displayName": "Task Debug build",
"description": "Builds the target as debug",
"generator": "Ninja",
"binaryDir": "${sourceDir}/.out/task-debug",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
} }
] ]
} }

8
task3/CMakeLists.txt Normal file
View File

@ -0,0 +1,8 @@
find_package(Qt6 COMPONENTS Core REQUIRED)
add_executable(task3-chpt3ex12)
target_sources(task3-chpt3ex12 PRIVATE
main.cpp)
target_link_libraries(task3-chpt3ex12 PRIVATE
Qt6::Core)

90
task3/main.cpp Normal file
View File

@ -0,0 +1,90 @@
#include <iostream>
#include <QSemaphore>
#include <QThread>
#include <QCoreApplication>
/*
* Barlas Chpt 3 Ex 12:
Create three threads, each printing out the letters A, B, and C.
The printing must adhere to these rules:
The total number of Bs and Cs that have been output at any
point in the output string cannot exceed the total number
of As that have been output at that point.
After a C has been output, another C cannot be output until
one or more Bs have been output.
Use semaphores to solve the problem.
*/
class Printer {
private:
QSemaphore &lockBC;
QSemaphore &lockC;
public:
explicit Printer(QSemaphore &lockBC, QSemaphore &lockC) : lockBC(lockBC), lockC(lockC) {};
void printA() {
this->lockBC.release(1);
std::cout << "A\n";
}
void printB() {
if (this->lockBC.tryAcquire(1, 10000)) {
if (this->lockC.available() == 0) {
this->lockC.release(1);
}
std::cout << "B\n";
}
}
void printC() {
if (this->lockBC.tryAcquire(1, 10000)) {
if (this->lockC.tryAcquire(1, 10000)) {
std::cout << "C\n";
} else {
this->lockBC.release(1);
}
}
}
};
class Worker : public QThread {
private:
QSemaphore &lockBC;
QSemaphore &lockC;
public:
Worker(QSemaphore &lockBC, QSemaphore &lockC) : lockBC(lockBC), lockC(lockC) {};
protected:
void run() {
Printer print = Printer(this->lockBC, this->lockC);
print.printA();
print.printB();
print.printC();
}
};
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
QSemaphore lockC(1);
QSemaphore lockBC(0);
Worker trd1(lockBC, lockC);
Worker trd2(lockBC, lockC);
Worker trd3(lockBC, lockC);
trd1.start();
trd2.start();
trd3.start();
// int N = 3;
// Worker *workers[N];
// for (int i = 0; i < N; i++) {
// workers[i] = new Worker(lockBC, lockC);
// workers[i]->run();
// }
return app.exec();
}