Avatar billede nielsenmathias Nybegynder
21. oktober 2004 - 09:33 Der er 7 kommentarer og
1 løsning

Problemer med tråd arkitektur

Kan følgende arkitektur lade sig gøre?

              main
                |
            controller
    |    |        |      |
  tråd  tråd    tråd    tråd

Umiddelbart ser det vel meget nemt og tilforladeligt ud. main opretter en controller-tråd, der skal lytte på input fra noget hw, og efterfølgende opretter en ny tråd til at servicere denne hw. vel lidt ligesom en web-server der lytter efter requests og opretter en tråd for hver ny connection.
Jeg spørger naturligvis kun fordi det giver mig problemer! så længe main opretter de underste tråde kører alt fint, men hvis controlleren skal oprette dem (jf "figuren") opstår der segmentation faults.
så mine spørgsmål er:
.Er der noget specielt jeg skal være opmærksom på? segmentation faults kan så vidt jeg ved, skyldes pointere der 'træder' på hinandens memory...kan dette være tilfældet her?
.Nogen bemærkninger til 'arkitekturen'?
Avatar billede arne_v Ekspert
21. oktober 2004 - 18:09 #1
Hvad laver main tråden efter at have startet controller tråden ?
Avatar billede arne_v Ekspert
21. oktober 2004 - 18:10 #2
Umiddelbart er der ikke noget som får alarm klokkerne til at ringe.
Avatar billede nielsenmathias Nybegynder
21. oktober 2004 - 19:50 #3
nej vel...
den kører blot i en while løkke, ligesom de andre tråde. dvs. selvom ingen af trådene gør noget, opstår der segmentation fault.
Avatar billede arne_v Ekspert
22. oktober 2004 - 21:16 #4
Vi skal nok se noget kode for at kunne komme videre.

Kan du genskabe problemet med "behersket" mængde kode ?

F.eks. under 100 linier.
Avatar billede nielsenmathias Nybegynder
23. oktober 2004 - 13:03 #5
yeps, det vil jeg prøve. first thing monday morning :)
Avatar billede nielsenmathias Nybegynder
25. oktober 2004 - 10:57 #6
Så er koden minimeret. Jeg har lavet en generel tråd klasse for at
få det hele til at se lidt pænere ud. De tre tråde på følgende
"figur" arver fra denne klasse.
Hovedobjektet Thread og følger i de første filer.

    main
      |
    Controller
  |          |
Sim_rx        Provider_rx

->alle fire tråde skal køre samtidigt.
Problem : første gang efter genstart opstår der segmentation fault efter
ca. 20 sekunder. Anden gang programmet startes kører det ved første øjekast
fint, men meget af funktionaliten(som er skåret fra) virker ikke.
Hvis Sim_rx og Provider_rx startes fra main (dvs. controller oprettes ikke)
kører alt uden problemer. QUE?



***************************
Thread.h
***************************
#include <pthread.h>
class Thread
{
    private:
        static void * thread_function(void * parameter);
        pthread_t m_thread;
       
    protected:
        virtual void run() = 0;
   
    public:
        Thread();
        void start();
};

***************************
Thread.cc
***************************
#include "/root/Projects/Provider_3/include/Thread.h"

void * Thread::thread_function(void * parameter)
{
    //parameter peger på et thread objekt
    Thread * t = (Thread*)parameter;
   
    //trådens run-metode
    if( t != NULL)
        t->run();
    t->m_thread = 0;
    return 0;
}

Thread::Thread() : m_thread(0)
{}

void Thread::start()
{
    pthread_create(&m_thread, 0, thread_function, this);
}

***************************
main.cc
***************************
#include "/root/Projects/Provider_3/include/Controller.h"
#include <iostream>

int main()
{
    Controller ctrl("Starting ControllerThread ...");
    ctrl.start();   
   
    Provider_rx provider_rx("Starting ProviderThread (RX)...");
    Sim_rx sim_rx("Starting SimThread (RX)...");
   
    provider_rx.start();
    sim_rx.start();
   
    while(1)
    {
        cout<<"%";
    }
   
    return 0;
}
***************************
Controller.h
***************************
#include <string>
#define SLEEP(x) sleep(x)
#include "/root/Projects/Provider_3/include/Provider_rx.h"
#include "/root/Projects/Provider_3/include/Sim_rx.h"

#define SLEEP(x) sleep(x)

using namespace std;

class Controller : public Thread
{   
    private:
        bool createThreads;
        string m_whatToSay;
    protected:
        virtual void run();       
    public:
        Controller(string s);
        void startThreads();
};

***************************
Controller.cc
***************************
#include "/root/Projects/Provider_3/include/Controller.h"

Controller::Controller(string s)
: m_whatToSay(s)
{
    createThreads = true;
}

void Controller::run()
{
    cout << m_whatToSay<<endl;
    cout.flush();
    while(1)
    {
        startThreads();   
//        cout<<"*";
    }
}

void Controller::startThreads()
{
    if(createThreads)
    {
        Provider_rx provider_rx("Starting ProviderThread (RX)...");
        Sim_rx sim_rx("Starting SimThread (RX)...");
        provider_rx.start();
        sim_rx.start();
        createThreads = false;
    }
}

***************************
Provider_rx.h
***************************
#ifndef A_SEEN
#define A_SEEN
#include "/root/Projects/Provider_3/include/Thread.h"
#endif
#include <string>

#define SLEEP(x) sleep(x)

class Provider_rx : public Thread
{
    private:   
        string m_whatToSay;

    protected:
        virtual void run();
           
    public:
        Provider_rx(string s);//, const Sptr < Fifo < Sptr < SipProxyEvent > > > inputFifo);//, myUaCli* temp);
};   


***************************
Provider_rx.cc
***************************
#include "/root/Projects/Provider_3/include/Provider_rx.h"

void Provider_rx::run()
{
    cout << m_whatToSay<<endl;
    cout.flush();
   
    while(1)
    {
        //provideOutBuf();
        cout<<"&";
    }
}
   
Provider_rx::Provider_rx(string s)
: m_whatToSay(s)
{}

***************************
Sim_rx.h
***************************
#ifndef A_SEEN
#define A_SEEN
#include "/root/Projects/Provider_3/include/Thread.h"
#endif

#include <iostream>
#include <string>

#define SLEEP(x) sleep(x)


class Sim_rx : public Thread
{
    private:   
        string m_whatToSay;   
   
    protected:
        virtual void run();
           
    public:
        Sim_rx(string s);
};

***************************
Sim_rx.cc
***************************
include "/root/Projects/Provider_3/include/Sim_rx.h"
void Sim_rx::run()
{
    cout << m_whatToSay<<endl;
    cout.flush();

    while(1)
    {
        //simulateInVoice();
        cout<<"!";
    }
}
   
Sim_rx::Sim_rx(string s)
: m_whatToSay(s)
{}

:D
Avatar billede nielsenmathias Nybegynder
25. oktober 2004 - 11:19 #7
undskyld for den lange post. Sim_rx og provider_rx er iøvrigt nøjagtig ens (bortset fra nvanet self) når de som her er stribbet for funktionalitet, så der kunne jeg nok ha sparet lidt linier. but anyways, håber nogen kan lure hvad der skaber segmentation fault
Avatar billede nielsenmathias Nybegynder
24. januar 2005 - 09:15 #8
!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis