Avatar billede ahara Nybegynder
05. juni 2004 - 15:58 Der er 12 kommentarer og
1 løsning

Tråde i c++

Hej

Jeg er ny i tråde, så jeg kunne godt bruge lidt hjælp. Hvorfor kan jeg ikke kompilere følgende kode med g++ kompileren?

Tak
AHR

********************

#include <iostream.h>
#include <pthread.h>

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

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

int main()
{
    pthread_t xy;

    pthread_create(&xy, NULL, x, NULL);
        pthread_create(&xy, NULL, y, NULL);
    return 0;
}
Avatar billede arne_v Ekspert
05. juni 2004 - 16:03 #1
Hvis du ændrer x og y til:

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

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

og compiler på en platform som unerstøtter POSIX threads (læs: ikke windows), så
bør det også compile.
Avatar billede ahara Nybegynder
05. juni 2004 - 17:37 #2
Tak. Nu vil det kompileres men mine tråde skriver ikke x samt y ud på skærmen. Nogen der ved hvorfor? Jeg benytter cygwin samt g++ til kompilering.

Tak
AHR
Avatar billede arne_v Ekspert
05. juni 2004 - 17:49 #3
Prøv at lade main thread vente indtil de 2 tråde har afsluttet.
Avatar billede arne_v Ekspert
05. juni 2004 - 18:04 #4
pthread_join
Avatar billede arne_v Ekspert
05. juni 2004 - 18:04 #5
og et svar
Avatar billede ahara Nybegynder
05. juni 2004 - 18:24 #6
Skriver jeg bare pthread_join; i min main virker det stadig ikke. Men jeg skal jo joine de trådene så der skal vel et eller andet mellem (). Altså pthread_join(xxxxx)

Kan du hjælpe med det.

Tak igen
Avatar billede arne_v Ekspert
05. juni 2004 - 18:34 #7
void *retval;
pthread_join(xy,&retval);
Avatar billede ahara Nybegynder
05. juni 2004 - 18:47 #8
Koden ser nu sådan ud. Den kompilerer men udskriver ikke sætningerne.

Nogen yderligere ideer.

********

#include <iostream.h>
#include <pthread.h>

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

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

    return NULL;
}

int main()
{
    pthread_t xy;
   
    pthread_create(&xy, NULL, x, NULL);
    pthread_create(&xy, NULL, y, NULL);
    void *retval;
    pthread_join(xy,&retval);

    return 0;
}
Avatar billede ahara Nybegynder
05. juni 2004 - 19:33 #9
Virker nu med følgende:

#include <iostream.h>
#include <pthread.h>

void* x(void* a)
{
    int b=0;
    while(b<10)
    {
    cout<<"x"<<endl;
    b++;
    }
   
    return NULL;
}

void* y(void* a)
{
    int b=0;
    while(b<10)
    {
    cout<<"y"<<endl;
    b++;
    }
    return NULL;
}

int main()
{
    pthread_t xy;
   
    pthread_create(&xy, NULL, x, NULL);
    pthread_create(&xy, NULL, y, NULL);
    pthread_join(xy,NULL);
    pthread_join(xy,NULL);

    return 0;
}
Avatar billede arne_v Ekspert
05. juni 2004 - 20:29 #10
#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;
}

virker fint hos mig.

Det burde ikke gøre noget forskel om man skriver 1 eller 10 gange.

Jeg har pyntet lidt ved at bruge 2 forskellige tråd referencer.

Jeg tror iøvrigt ikke at cout er thread safe, så principielt burde
der bruges en mutex.
Avatar billede arne_v Ekspert
16. juni 2004 - 22:08 #11
Tid at få lukket spørgsmålet ?
Avatar billede arne_v Ekspert
21. juni 2004 - 22:25 #12
?
Avatar billede arne_v Ekspert
25. juli 2004 - 23:18 #13
??
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