🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #309924

Re: std::thread DESPERACKA PROŚBA O POMOC!!!

#309924
From: M.M.
Date: Thu, 12 Sep 2019 12:09
172 lines
6096 bytes
On Wednesday, September 11, 2019 at 8:29:21 PM UTC+2, Szyk Cech wrote:
> Cześć!
> 
> [Czego chcę]
> Chcę napisać klasę realizującą semafor.
> Chcę do niej napisać testy jednostkowe udowadniające jej proprawność.
> 
> [Co ja robię]
> Znalazłem w Internecie strony jakiejś instytucji naukowej na której
> była klasa semafora i zainspirowany nią napisałem swoją wersję.
> Oto te strony:
> http://sandbox.mc.edu/~bennet/cs422b/notes/semaphore_h.html
> http://sandbox.mc.edu/~bennet/cs422b/notes/semaphore_cpp.html
> 
> Jak widać klasa jest prosta jak drut. Jednak nie działa u mnie.
> Mam wyścigi które zatrzymują aplikację testową.
> Aplikacja działa w debugerze. Działa też gdy dodam jakieś linie:
> cout << "message" << endl << flush;
> Jednak nie działa gdy uruchamia się ją samodzielnie (ani w trybie debug
> ani w trybie release).
> Mój system to Linux KDE Neon (bazuje na Ubutnu 18.04 LTS).
> Mój procesor to Intel Core Duo (z 2009 roku).
> 
> [Jak odtworzyć błąd]
> Wklejam poniżej kod który jest kompletnym minimalnym przykładem.
> Jest on w pełni automatyczny. Trzeba jedynie utworzyć 3 małe pliki,
> nadać im uprawnienia wykonania i odpalić skrypt run.sh z lini komend.
> Po 2-3 iteracjach u mnie wykonanie zamiera z nie znanego powodu.
> 
> Proszę o pomoc! Z góry dzięki i pozdro!
> Szyk Cech
> 
> 
> [Pliki]
> =============================================================
> BEGIN: run.sh
> 
> #!/bin/bash
> 
> ./make.sh
> 
> lCounter=0
> 
> while [ 1 ]; do
>      lCounter=$[lCounter + 1]
>      echo "Run: $lCounter"
>      ./semtest
> done
> 
> END:  run.sh
> 
> =============================================================
> 
> BEGIN: make.sh
> 
> #!/bin/bash
> g++ -std=c++17 -pthread -O2 -s -DNDEBUG ./Main.cpp -o semtest
> 
> END: make.sh
> 
> =============================================================
> 
> BEGIN: Main.cpp
> 
> #include <mutex>
> #include <condition_variable>
> #include <chrono>
> #include <thread>
> #include <vector>
> #include <iostream>
> 
> 
> using namespace std;
> 
> class Semaphore
> {
> public:
>      Semaphore(int aCounter);
> 
> public:
>      int value();
>      void up();
>      void down();
> 
> protected:
>      int mCounter;
>      std::mutex mAccessMutex;
>      std::condition_variable mWaitingCondition;
> };
> 
> Semaphore::Semaphore(int aCounter)
>      : mCounter(aCounter)
> {
> }
> 
> int Semaphore::value()
> {
>      return mCounter;
> }
> 
> void Semaphore::down()
> {
>      unique_lock lock(mAccessMutex);
>      --mCounter;
>      if(mCounter < 0)
>          mWaitingCondition.wait(lock);
> }
> 
> void Semaphore::up()
> {
>      unique_lock lock(mAccessMutex);
>      ++mCounter;
>      if(mCounter <= 0)
>          mWaitingCondition.notify_one();
> }
> 
> void SemTestThread(Semaphore* aSem)
> {
>      aSem->down();
> }
> 
> int main()
> {
>      Semaphore lSem(5);
>      vector<thread> lArray;
>      lArray.resize(15);
> 
>      for(unsigned long i(0); i < lArray.size(); ++i)
>          lArray[i] = thread(SemTestThread, &lSem);
> 
>      bool lResult(true);
> 
>      for(int i(0); i < 5; ++i)
>          lArray[i].join();
> 
>      lResult = lResult && (lSem.value() == -10);
> 
>      for(int i(10); i > 0; --i)
>      {
>          lSem.up();
>          lArray[15 - i].join();
>          lResult = lResult && (lSem.value() == -i + 1);
>      }
> 
>      cout << "lResult: " << lResult << endl << flush;
> //    return EXIT_SUCCESS;
> }
> 
> END: Main.cpp

Hmmmm Nie wiem co program ma robić, z kodu, przepraszam, ale nie
chce mi się wnioskować. Co mogę ogólnie doradzić... W QT jest to
baaaardzo przejrzyście i intuicyjnie zrobione. Jest osobna klasa do
objęcia zapisów i osobna do odczytów.

https://doc.qt.io/qt-5/qreadlocker.html
https://doc.qt.io/qt-5/qwritelocker.html
https://doc.qt.io/qt-5/qreadwritelock.html

Jeśli musisz używać biblioteki standardowej, to napisz sobie takie
klasy. Podstawowa ich implementacja jest łatwa, sam pisałem kiedyś.
Potem zacznij od jednego lockera na cały program, odczyty obejmij 
blokowaniem odczytów, a zapisy blokowaniem zapisów. Zadziała na
100%. Gdy będzie działało za wolno (czyt. gdy któryś z wątków
nie będzie obciążał na 100% rdzenia), to możesz pomyśleć o 
zwiększeniu ilości lockerów w programie, ale trzeba to
zrobić z rozwagą: Dane które muszą zachować spójność w całym programie
muszą być objęte jednym i tym samym lockerem. Jeśli lockery są
zagnieżdżone, to kolejność wchodzenia do lockerów w każdej części
programu najlepiej jak jest taka sama. 

Pozdrawiam
Technical Details
Message-ID: <19d2055b-e9fd-418f-92f2-5cdcbf86b5ff@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!o24no10809710qtl.0!news-out.google.com!x7ni92qtf.0!nntp.google.com!o24no10809708qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
References: <42beF.199079$hJ3.167352@fx07.am4>

Show Full Headers
Complete Article Headers
X-Received: by 2002:a05:620a:119a:: with SMTP id b26mr1767049qkk.39.1568290146366;        Thu, 12 Sep 2019 05:09:06 -0700 (PDT)
X-Received: by 2002:a25:50c6:: with SMTP id e189mr1552175ybb.373.1568290146106; Thu, 12 Sep 2019 05:09:06 -0700 (PDT)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!3.eu.feeder.erje.net!feeder.erje.net!weretis.net!feeder7.news.weretis.net!proxad.net!feeder1-2.proxad.net!209.85.160.216.MISMATCH!o24no10809710qtl.0!news-out.google.com!x7ni92qtf.0!nntp.google.com!o24no10809708qtl.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.c
Date: Thu, 12 Sep 2019 05:09:05 -0700 (PDT)
In-Reply-To: <42beF.199079$hJ3.167352@fx07.am4>
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=178.36.205.84; posting-account=xjvq9QoAAAATMPC2X3btlHd_LkaJo_rj
NNTP-Posting-Host: 178.36.205.84
References: <42beF.199079$hJ3.167352@fx07.am4>
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <19d2055b-e9fd-418f-92f2-5cdcbf86b5ff@googlegroups.com>
Subject: Re: std::thread DESPERACKA PROŚBA O POMOC!!!
From: "M.M." <mmarszik@gmail.com>
Injection-Date: Thu, 12 Sep 2019 12:09:06 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit