Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Semofory w C++ :/

 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 semestr - Systemy Operacyjne
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Pią 21:25, 19 Maj 2006    Temat postu: Semofory w C++ :/

Piszę do osób, które tak jak ja, popełniły ten koszmarny błąd i wybrały sobie na ćwiczeniach u dr Kality projekt wielowątkowy pisany w C++. Macie jakieś pomysły na implementację? Słyszałem że o WindowsAPI można zapomnieć, bo jest przestraszne. Czy ktoś z Was używał biblioteki wątkowej dołączajej do Borlanda? Doszły także plotki, że jakiś inny ćwiczeniowiec (nie pamiętam kto dokładnie) udostępnił swim studentom bibliotekę z wątkami własnej roboty. Wiecie coś o tym?
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
exeman
Mistrz grilla



Dołączył: 03 Lut 2006
Posty: 1603
Przeczytał: 0 tematów

Skąd: znienacka

PostWysłany: Pią 22:37, 19 Maj 2006    Temat postu:

masz mutexy w C++ (w unix[-opodobnych systemach]) a w windzie piekne sekcje krytyczne.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Sob 3:02, 20 Maj 2006    Temat postu:

Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?:
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Sob 11:18, 20 Maj 2006    Temat postu:

Skrobocik napisał:
Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?:
oj, wydaje mi się że raczej nie, przynajmniej mnie nic nna ten temat nie wiadomo...
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
chlebek
alkoholik



Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów

Skąd: Siedlce\Kraków

PostWysłany: Sob 12:22, 20 Maj 2006    Temat postu:

Skrobocik napisał:
Czy mi się wydaje, czy w KRAK'u Mrozka są wątki :?:


Na pewno nie ma, bo pytalem sie dr Wilczka
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
r4ku
żul



Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów

Skąd: klikash? :D

PostWysłany: Sob 14:04, 20 Maj 2006    Temat postu:

byc moze tu znajdziesz cos ciekawego, pod koniec jest cos o wielowatkowosci w cpp wraz z przykladami [link widoczny dla zalogowanych]
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Skrobocik
[SKROBORANGA]



Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów

Skąd: Skarżysko , Kraków

PostWysłany: Sob 14:36, 20 Maj 2006    Temat postu:

Wiedziałem, że coś mi świta w łebku :wink: Właśnie Kapelka coś pokazywał na ostatnich ćwiczonkach
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Sob 14:41, 20 Maj 2006    Temat postu:

Ostatnio piszę co nieco w WinAPI i mam już gotowych parę klas do tworzenia wątków i sekcji krytycznej. Jeśli komuś się przyda, to mogę tu wrzucić.

EDIT:
Zapraszam:
[link widoczny dla zalogowanych]

G++/Windows only

Kompilacja przykładu:
g++ -o threads.exe main.cpp libthcs.a
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
SZCZUR
żul



Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów


PostWysłany: Sob 20:58, 20 Maj 2006    Temat postu:

tez mam opakowane w klasy win api
macie tam watki i semaforki
dalem pelny kod więc nie zapomnijcie dodac do projektu "Thread.cpp"

jest tez przyklad z opisem w "main.cpp"

[link widoczny dla zalogowanych]

dziala z: GCC, visual
z borlandem pewnie tez ale nie mam gdzie sprawdzic

jak cos nie dziala to piszcie tutaj
samodzielna walka z win api to nic ciekawego:)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Sob 21:23, 20 Maj 2006    Temat postu:

SZCZUR: źle zrobiłeś ochronę przed kopiowaniem. Jeśli program będzie kompilowany z NDEBUG, to asercja zostanie wyrzucona z kodu wynikowego i program pójdzie w krzaki. Standardowym sposobem na to jest zadeklarowanie operatora przypisani ORAZ konstruktora kopiującego jako prywatne metody. Wtedy nie trzeba ich implementować - zostawiasz same deklaracje. Bo teraz można zrobić kopię wątku:

MyThread t1;
MyThread t2(t1);

Poza tym nie bardzo mi się podoba, że gdy obiekt wątku wychodzi z zasięgu, to stopujesz go. Ja rozwiązałem to inaczej - dałem użytkownikowi możliwość zdecydowania.

To takie moje uwagi odnośnie kodu. Dzięki za podzielenie się nim.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
SZCZUR
żul



Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów


PostWysłany: Sob 22:43, 20 Maj 2006    Temat postu:

ochrona przed kopiowaniem poprawiona, dzięki.

jezeli obiekt Thread wychodzi poza zakres to watek (z windows) jest konczony, urzytkownik i tak nie mial by juz nad nim kontroli, pojawialo by sie tez pytanie jak dlugo obiek na ktory wskazywal Data() ma byc trzymany.
Po prostu nie widze dla tego zastosowania, jesli ktos chce "długo" mieć thread'a to zrobi new Thread i skasuje kiedy trzeba (np wątek jak dojdzie do konca Run() to zrobi delete this;)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Nie 12:53, 21 Maj 2006    Temat postu:

SZCZUR: tak siadłem i się zastanawiałem, czemu zrobiłem wątki na na szablonach (lub obiekt wątku jako składowy). Miałem ten sam problem, który masz w swoim kodzie. Jest poważny błąd.

Kod:
#include <windows.h>
#include "Thread.h"
#include <iostream>
using namespace std;

// 1 - obiekt zyje
// 0 - obiekt umarl
struct CzarnaSkrzynka
{
    CzarnaSkrzynka() : x(1) { }
    ~CzarnaSkrzynka() { x = 0; }
    int x;
};

class Thread : public S_CThread
{
    public:
        virtual void Run()
        {
            while(1)
            {   
                cout << cs.x << endl;
                Sleep(100);
            }
        }   
        virtual void OnCancel()
        {               
        }
    private:
        CzarnaSkrzynka cs;   
};

int main()
{
    Thread* t = new Thread();
    t->Start();
    Sleep(300);
    delete t;
    cout << "koniec" << endl;
}


W trakcie usuwania obiektu jest już za późno, by stopować wątek, bo on już nie istnieje! Kolejność usuwania obiektów to: obiekt klasy pochodnej -> obiekt klasy bazowej -> obiekty składowe. Więc w Twoim destruktorze, gdy robisz Cancel na wątku, procesor może odebrać czas destruktorowi i dać go znów wątkowi, który już nie istnieje. Żeby to zauważyć empirycznie, trzeba nieco spowolnić destruktor:

Kod:
S_CThread::~S_CThread(void){
    Sleep(100);                       
   if(IsRunning())
      Cancel();
}


Wtedy wyjście programu wygląda u mnie tak:
Kod:
D:\Temp\szczur>test
1
1
1
0
koniec


Czyli odwołujesz się do obiektu, który już nie istnieje. W tym przypadku o dziwo program się nie wykrzacza, ale może to prowadzić do naprawdę trudnych do wykrycia błędów.

Jednak implementacja wątków nie jest taka prosta :|
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cheater_
Orajt:)



Dołączył: 28 Lut 2006
Posty: 1022
Przeczytał: 0 tematów


PostWysłany: Nie 13:05, 21 Maj 2006    Temat postu:

@SZCZUR - ładne to, i 'dokumentacja' nawet jest :) Dzięki, na obecną chwilę Twoja biblioteka to chyba najwygodniejszy sposób implementacji tego :)
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
SZCZUR
żul



Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów


PostWysłany: Nie 17:04, 21 Maj 2006    Temat postu:

pomyslalem o tym ale w drugą strone:
zeby zrobic szablon i threda urzytkownika jako obiekt skladowy i jest taki problem ze user w swoim konstruktorze moze chciec sie odwolac do mojego S_CThread który jest nieskonstruowany. a ja daje userThreadowi dostęp do S_CThread.

no i żeczywiscie jest maly problem, ale postaram sie to wkrótce poprawic.

Edit:
ale mam juz pomysl, jak tylko przepchne "P" to sie zabiore za to.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stefan
pijak



Dołączył: 22 Lis 2005
Posty: 173
Przeczytał: 0 tematów


PostWysłany: Nie 22:22, 21 Maj 2006    Temat postu:

Rozmawiałem dzis o tym chwilę z moim współlokatorem i zastanawialiśmy się jak to jest zrobione w VCL'u Borlanda, bo tam też jest to zrobione przez funkcje wirtualne. Jest tam wymuszone tworzenie obiektów na stercie, czyli poprzez operator new. Zapewne operator delete jest odpowiednio przeładowany i zajmuje się wszystkim. Jest to też rozwiązanie, ale mnie się średnio podoba, bo duża część piękna klas leży w tym, że destruktor sam się wywoła, gdy skończy się obiekt zasięgu, a tutaj jakoby jest to samo, co w C, tyle że pod inną składnią.

Jakoś nie mogę też sobie wyobrazić, po co użytkownik dostarczający parametr szablonu będącego składową miałby się odwoływać do klasy wątku? Przy odpowiedniej abstrakcji, to użytkownik już obiektu wątku będzie się wszystkim zajmował.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
SZCZUR
żul



Dołączył: 09 Lis 2005
Posty: 603
Przeczytał: 0 tematów


PostWysłany: Pon 0:04, 22 Maj 2006    Temat postu:

zeby dostac parametr Data();
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
h
pijak



Dołączył: 15 Lis 2005
Posty: 134
Przeczytał: 0 tematów


PostWysłany: Pią 2:27, 09 Cze 2006    Temat postu:

ja dzisiaj napisałem projekt w pthread.h, proste, fajne, przyjemne. tylko że ja nie miałem wyboru - ANSI C.
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Stasiu
zielony żul



Dołączył: 16 Lis 2005
Posty: 920
Przeczytał: 0 tematów

Skąd: krk

PostWysłany: Pią 2:37, 09 Cze 2006    Temat postu:

Ja lecę na WinAPI. Opakowałem sobie ładnie w klasy i praktycznie przeklepałem z javy wsio ;) Największy problem z tą wizualizacją :/
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 semestr - Systemy Operacyjne Wszystkie czasy w strefie EET (Europa)
Strona 1 z 1

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach

fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
Regulamin