Compare commits

..

No commits in common. "9ff5c03e6e5c09ce4c35af4438a75abf6c8e368f" and "f7d12edd604abb582dad231da769f16692d22dfd" have entirely different histories.

2 changed files with 52 additions and 69 deletions

View File

@ -19,24 +19,28 @@ public:
private: private:
auto parition(std::span<T> &data) -> std::pair<std::span<T>, std::span<T>> { auto parition(std::span<T> &data) -> std::pair<std::span<T>, std::span<T>> {
auto pivot = data.begin();
std::advance(pivot, std::distance(data.begin(), data.end()) / 2);
auto lefti = data.begin(); std::vector<T> buf(data);
auto righti = data.end() - 1;
auto pivot = buf.begin();
std::advance(pivot, std::distance(buf.begin(), buf.end()) / 2);
auto lefti = buf.begin();
auto righti = buf.end();
while (1) { while (1) {
for (; cmp((*lefti), (*pivot)); lefti++); for (; cmp(*lefti, *pivot); lefti++);
for (; !cmp((*righti), (*pivot)); righti--); for (; !cmp(*righti, *pivot); righti--);
if (lefti >= righti) { if (lefti >= righti) {
break; break;
} }
std::swap(*lefti, *righti); std::swap(lefti, righti);
} }
return {std::span<T>(data.begin(), pivot - 1), std::span<T>(pivot + 1, data.end())}; std::move(buf.begin(), buf.end(), data.begin());
return {std::span<T>(data.begin(), lefti), std::span<T>(lefti, data.end())};
} }
@ -50,9 +54,13 @@ private:
} }
} }
auto res = parition(data); // Determine mid of data
auto &left = res.first; auto mid = data.begin();
auto &right = res.second; std::advance(mid, std::distance(data.begin(), data.end()) / 2);
// Generate left and right view on data (no copies are made here)
std::span<T> left(data.begin(), mid);
std::span<T> right(mid, data.end());
if (depth < mdepth) { if (depth < mdepth) {
std::thread left_thread([&]() { qsort(left, depth + 1, mdepth); }); std::thread left_thread([&]() { qsort(left, depth + 1, mdepth); });

View File

@ -15,52 +15,35 @@
Use semaphores to solve the problem. Use semaphores to solve the problem.
*/ */
struct IPrintable { class Printer {
~IPrintable() = default;
virtual auto print() const -> void = 0;
};
class PrintA : public IPrintable {
private:
QSemaphore &lockBC_;
public:
explicit PrintA(QSemaphore &lockBc) : lockBC_(lockBc) {}
auto print() const -> void override {
this->lockBC_.release(1);
std::cout << "A";
}
};
class PrintB : public IPrintable {
private: private:
QSemaphore &lockBC_; QSemaphore &lockBC_;
QSemaphore &lockC_; QSemaphore &lockC_;
public:
explicit PrintB(QSemaphore &lockBc, QSemaphore &lockC) : lockBC_(lockBc), lockC_(lockC) {}
auto print() const -> void override { QString name_;
if (this->lockBC_.tryAcquire(1)) {
public:
explicit Printer(QSemaphore &lockBC, QSemaphore &lockC, QString name) : lockBC_(lockBC), lockC_(lockC),
name_(name) {};
void printA() {
this->lockBC_.release(1);
std::cout << name_.toStdString() << " A\n";
}
void printB() {
if (this->lockBC_.tryAcquire(1, 10000)) {
if (this->lockC_.available() == 0) { if (this->lockC_.available() == 0) {
this->lockC_.release(1); this->lockC_.release(1);
} }
std::cout << "B"; std::cout << name_.toStdString() << " B\n";
} }
} }
};
class PrintC : public IPrintable { void printC() {
private: if (this->lockBC_.tryAcquire(1, 10000)) {
QSemaphore &lockBC_; if (this->lockC_.tryAcquire(1, 10000)) {
QSemaphore &lockC_; std::cout << name_.toStdString() << " C\n";
public:
explicit PrintC(QSemaphore &lockBc, QSemaphore &lockC) : lockBC_(lockBc), lockC_(lockC) {}
auto print() const -> void override {
if (this->lockBC_.tryAcquire(1)) {
if (this->lockC_.tryAcquire(1)) {
std::cout << "C";
} else { } else {
this->lockBC_.release(1); this->lockBC_.release(1);
} }
@ -68,41 +51,33 @@ public:
} }
}; };
template<typename T, typename ...Argts>
class Worker : public QThread { class Worker : public QThread {
private: private:
std::unique_ptr<IPrintable> printer_; Printer printer_;
public: public:
Worker(QString tname, Argts &... args) : printer_(std::make_unique<T>(args...)) {}; Worker(QSemaphore &lockBC, QSemaphore &lockC, QString tname) : printer_(lockBC, lockC, tname) {};
protected: protected:
void run() { void run() {
while (true) { printer_.printA();
printer_->print(); printer_.printB();
std::cout.flush(); printer_.printC();
sleep(1);
}
} }
}; };
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
//QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
QSemaphore lockC(1); QSemaphore lockC(1);
QSemaphore lockBC(0); QSemaphore lockBC(0);
Worker<PrintA, QSemaphore> t1("Thread 1", lockBC); int N = 3;
Worker<PrintB, QSemaphore, QSemaphore> t2("Thread 1", lockBC, lockC); Worker *workers[N];
Worker<PrintC, QSemaphore, QSemaphore> t3("Thread 1", lockBC, lockC); for (int i = 0; i < N; i++) {
workers[i] = new Worker(lockBC, lockC, QString("Thread %1").arg(i));
workers[i]->start();
}
t1.start(); return app.exec();
t2.start();
t3.start();
t1.wait();
t2.wait();
t3.wait();
//return app.exec();
return 0;
} }