Avatar billede nielsenmathias Nybegynder
30. september 2004 - 14:51 Der er 15 kommentarer og
1 løsning

Tråd programmering i C++

Hejsa, et spørgsmål om trårprogrammering i c++

Jeg er lige gået igang med at udvikle et program der skal indeholde flere tråde, køre under linux, og implementeres i c++. Og mine c++ kundskaber er (åbenbart) uttilstrækkelige.

Jeg har god erfaring med trådprogrammering i java. Her opretter man bare et objekt der extender thread...meget ligetil og letforståeligt. "det ingen problem simon" :)

men i c++, ak ... eller?
pthread. nogen der har erfaring med det? er det et c library eller? 
Her skal man specificere en metode tråden skal køre, og derudover er create kommandoen søbet ind i pointer-referencer*...hvorfor? findes der ikke en pendant til javas måde at gøre det på...altså et c++ library der muliggør objektorienteret tråd-programmering i c++ ? muligvis et dumt spørgsmål, men jeg har ikke umiddelbart kunnet finde noget om det på google. Jo en masse henvisninger til bøger om "objektorienteret trådprogramering i c++" ,og det lyder jo umiddelbart meget godt. Er der nogen der kan referere indholdet af sådan en bog? spøg til side, så ville jeg sætte pris på lidt hjælp omkring emnet.

bemærkning : jeg har ellers udemærkede c++ kundskaber og er godt bekendt med teori om tråde....


Takker!
Avatar billede arne_v Ekspert
30. september 2004 - 14:57 #1
POSIX threads er det du skal bruge (medmindre du vil droppe threads og forke
i stedet for).

Det er ganske rigtigt pthreads.h og pthread_ funktioner.e

Her er et super simpelt eksempel:

#include <pthread.h>

#include <iostream>

using namespace std;

void *x(void *a)
{
    cout << "x" << endl;
    return NULL;
}

void *y(void *a)
{
    cout << "y" << endl;
    return NULL;
}

int main()
{
    pthread_t xy1,xy2;
    pthread_create(&xy1, NULL, x, NULL);
    pthread_create(&xy2, NULL, y, NULL);
    void *retval1,*retval2;
    pthread_join(xy1,&retval1);
    pthread_join(xy2,&retval2);
    return 0;
}
Avatar billede arne_v Ekspert
30. september 2004 - 14:58 #2
Og C++ er altså lidt mere low level orienteret end Java.

Og mens Unix/Linux har valgt POSIX threads, så har Microsft valgt
sine helt egne Windows threads. Og de er ikke kompatible.
Avatar billede nielsenmathias Nybegynder
30. september 2004 - 15:03 #3
takker.
er det ikke noget med at man skal give compileren et argument... -pthread eller noget.  ?

den giver nemlig en fejl: undefined reference to pthread_join
Avatar billede arne_v Ekspert
30. september 2004 - 15:05 #4
Jo.

-lpthread

eller

-lpthreads

vil jeg tro
Avatar billede nielsenmathias Nybegynder
30. september 2004 - 15:10 #5
ja -lpthread var det vidst.

nu får jeg en segmentation fault... er det en pointer konflikt?
Avatar billede arne_v Ekspert
30. september 2004 - 15:13 #6
Sådan noget i den retning.

Mystisk - jeg tror da bestemt at jeg har testet den kode engang og set den virke.
Avatar billede nielsenmathias Nybegynder
30. september 2004 - 15:43 #7
det fungerer også fint hvis man kører det fra en konsol. bare ikke fra anjuta. men jeg takker!
Avatar billede arne_v Ekspert
30. september 2004 - 15:45 #8
godt
Avatar billede nielsenmathias Nybegynder
30. september 2004 - 18:41 #9
såååådan så er der styr på det. tak for hjælpen :)
Avatar billede olennert Nybegynder
04. oktober 2004 - 16:20 #10
Hvis du vil have noget der minder lidt om Java, så er det en ret enkel sag at lave en klasse der wrapper en pthread_t, og med en virtual void run() metode:

class BaseThread {
private:
    pthread_t thread;
public:
    virtual void run() = 0;
    void join();
};

(ja, der skal lidt mere til, dette er kun en skitse). Og så nedarv fra BaseThread, og implementer run-metoden. Så kan du lave noget i stil med

MyThread mt1, mt2;

mt1.run();
mt2.run();
mt1.join();
mt2.join();
Avatar billede arne_v Ekspert
17. oktober 2004 - 18:02 #11
mathias>

Så mangler du bare at accpterere svaret

olennart>

long time no see
Avatar billede olennert Nybegynder
18. oktober 2004 - 07:24 #12
arne>

Har været ude at rejse. Da jeg kom hjem fik jeg kanontravlt på arbejde. Har sådan set stadig travlt, men prøver at få kigget på spørgsmål her. Der er som regel noget man kan lære af.
Avatar billede nielsenmathias Nybegynder
18. oktober 2004 - 08:08 #13
arne_v... har jeg ikke gjort det? din besked med "godt" er da i hvert fald markeret med grøn ramme til venstre
Avatar billede arne_v Ekspert
18. oktober 2004 - 08:11 #14
Nej.

Spørgsmålet har stadigvæg gult flag.

Prøv at marker mit navn i boxen så det bliver blåt og klik accepter.
Avatar billede arne_v Ekspert
18. oktober 2004 - 08:11 #15
Spørgsmålet skifter til blåt flag når der er accepteret et svar.
Avatar billede nielsenmathias Nybegynder
18. oktober 2004 - 08:16 #16
aaah ok, kald mig bare newb :)
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