🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

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

#309922
From: Szyk Cech
Date: Wed, 11 Sep 2019 18:29
148 lines
4302 bytes
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
Technical Details
Message-ID: <42beF.199079$hJ3.167352@fx07.am4>
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!newsreader4.netcologne.de!news.netcologne.de!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!news.highwinds-media.com!fx07.am4.POSTED!not-for-mail

Show Full Headers
Complete Article Headers
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!newsreader4.netcologne.de!news.netcologne.de!peer01.ams1!peer.ams1.xlned.com!news.xlned.com!peer03.am4!peer.am4.highwinds-media.com!news.highwinds-media.com!fx07.am4.POSTED!not-for-mail
Newsgroups: pl.comp.lang.c
X-Mozilla-News-Host: news://newshosting.com:119
From: Szyk Cech <szykcech@spoko.pl>
Subject: std::thread DESPERACKA PROŚBA O POMOC!!!
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0
MIME-Version: 1.0
Lines: 150
Message-ID: <42beF.199079$hJ3.167352@fx07.am4>
X-Complaints-To: abuse(at)newshosting.com
NNTP-Posting-Date: Wed, 11 Sep 2019 18:29:20 UTC
Organization: Newshosting.com - Highest quality at a great price! www.newshosting.com
Date: Wed, 11 Sep 2019 20:29:34 +0200
X-Received-Bytes: 4136
X-Received-Body-CRC: 3144416452
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit