Avatar billede krukken Juniormester
04. oktober 2004 - 22:37 Der er 19 kommentarer og
1 løsning

Postfic threads

Hej, jeg har et problem med postfic threads. Mit program compiler fint, men under linkningen en kommer der en fejl som siger:
undefined reference to pthread_create
undefined reference to pthread_join.

Jeg har includeret pthread.h i filen - så det er ikke der problemet ligger.
Avatar billede krukken Juniormester
04. oktober 2004 - 22:38 #1
Jeg sidder på Linux Redhat 9.0, og compiler med g++
Avatar billede bertelbrander Praktikant
04. oktober 2004 - 22:42 #2
Du skal vist tilføje -lpthread til bygge kommandoen.
Avatar billede krukken Juniormester
04. oktober 2004 - 22:53 #3
Hvor skal jeg tilføje det? Jeg bruger en Makefile som ser sådan ud:
CC    = g++
CFLAGS    = -O2 -march=i386 -Wall
LFLAGS    = -s

PROJ    = Configuration
OBJS    = Driver.o prove.o OSV....

$(PROJ):    $(OBJS)
            $(CC) $(LFLAGS) $(OBJS) -o $@
clean:
            rm -f *.o *~ core
            rm -f *~
Avatar billede krukken Juniormester
04. oktober 2004 - 22:54 #4
CC    = g++
CFLAGS    = -O2 -march=i386 -Wall
LFLAGS    = -s -lpthread

PROJ    = Configuration
OBJS    = Driver.o prove.o OSV....

$(PROJ):    $(OBJS)
            $(CC) $(LFLAGS) $(OBJS) -o $@
clean:
            rm -f *.o *~ core
            rm -f *~
Avatar billede bertelbrander Praktikant
04. oktober 2004 - 22:55 #5
Under LFLAGS, så der står:

LFLAGS    = -s -lpthread
Avatar billede bertelbrander Praktikant
04. oktober 2004 - 22:57 #6
Det ser rigtigt ud.

Jeg er ikke sikker på at det hedder pthread. Prøv at kikke i din lib mappe.
Gcc på windows har ikke pthread :-(
Avatar billede krukken Juniormester
04. oktober 2004 - 23:12 #7
okay:-)

Kan du fortælle mig hvordan man lavet timesliding. Altså så to tråde som kører i uendeligt While-løkker, deles om en CPU? LIgenu startes de begge, men den ene får inden CPU tid!
Avatar billede bertelbrander Praktikant
04. oktober 2004 - 23:20 #8
Du er nødt til at sætte trådene til at vente på "noget". Så vidt jeg ved er der ikke timeslicing indbygget i posix threads.

Du kan evt. lave en tredie tråd (med høj prioritet) der bytter om på de to første trådes prioritet på skift. Den tredie tråd vil så blot lave en sleep(...), bytte prioritet, sleep(...) bytte prioritet, forfra...
Avatar billede olennert Nybegynder
06. oktober 2004 - 19:06 #9
Der skulle meget gerne være schedulering af POSIX tråde, så hvis du har to tråde, som begge laver noget i stil med

int i;
while (true) {
    i += 7;
    if (i > 2000000000)
        i = 0;
}

så skulle begge tråde gerne få tid, hvis du har startet dem begge to. Sæt evt. en printf ind der kaldes for hver en million gennemløb eller noget i den stil, og se hvad der sker.
Avatar billede krukken Juniormester
06. oktober 2004 - 19:52 #10
Jeg har prøvet bar at udskrive noget fra to uendelig while sætningen, hvor de hver kører i en tråd. Det ser ud som om det kun er den første som bliver startet som kommer til at køre.

Kan man ikke give en dem en periotet fra starten som foreksempelvis betyder at hvis en af trådene bliver vækket om, så overtaget den CPUen med det samme? Altså så den anden tråd kun bliver kørt "når der er tid til det"?
Avatar billede bertelbrander Praktikant
06. oktober 2004 - 21:29 #11
Så vidt jeg ved vil den først tråd få lov til at køre sålænge den har noget at lave.

Du kan styre hvilken tråd der kører ved at sætte en tråd til at vente, f.ex. på en semaphor, eller ved at ændre på trådenes prioritet.
Avatar billede krukken Juniormester
06. oktober 2004 - 21:35 #12
hvordan ændrer man så på trådenes prioritet? Jeg synes ikke at jeg har set noget nogen parameter til nogen funktion endnu som kendetegner trådenes prioritet.
Avatar billede bertelbrander Praktikant
06. oktober 2004 - 23:04 #13
Jeg troede at man kunne ændre en pthread's prioritet, det kan man ikke :-(

Jeg tror at du er nød til at lade trådene vente på en mutex som du så kan frigive/låse efter behov.

Ellers kunne du overveje at bruge et bedre tråd bibliotek. Jeg har arbejdet lidt med RTLinux fra:

http://www.fsmlabs.com/

Hvad skal du bruge det til?
Avatar billede krukken Juniormester
06. oktober 2004 - 23:11 #14
Jeg skal opsamle nogle data - og dette skal kører hvert sekund. Hvis jeg har opsamlet alle data og der er tid "tilovers" inden næste opsamling af data, skal der laves noget statistik over dataene.

Koster det andet tråd bibliotek noget?

Alternativet er vel at lave to programmer?
Avatar billede bertelbrander Praktikant
06. oktober 2004 - 23:15 #15
Hvordan opsamler du data? Hvordan kommer de ind i systemet?

RTLinux kan vist fåes gratis.
Avatar billede krukken Juniormester
06. oktober 2004 - 23:17 #16
Hvor?

Det bliver opsamlet via et serialt kabel.
Avatar billede bertelbrander Praktikant
06. oktober 2004 - 23:20 #17
Finder en gratis RTLinux her:
http://www.fsmlabs.com/products/openrtlinux/
Avatar billede segmose Nybegynder
07. oktober 2004 - 09:10 #18
Over serielt så er der rigeligt tid til overs :)

Der er forskellige måde at opsamle seriel data på i linux, som en fil, med signal eller skrive sit eget hardware interface, den "rigtige" metode er afhængig af dit behov, select passerede udmærket til mit project.

Brug select til at opsamle data i tråd 1, sæt et flag/mutex når nye data er klar, imellemtiden bruger tråd 2 så tiden mellem til at regne statistik. Hvis du kun vil lave for de helt nye data risikere du aldrig at få nogen, alternativt start beregning når du har et gyldigt sæt, kør den færdig start så på det nyeste gyldige sample.

Hvis du køre med 480Kbit/s kan du sætter tråd 1 til at vente med select (kan bruges som timer med de rigtige parameter) med den ønskede samplings tid og læser så fra seriel "filen" (dette kræver at data mængden ikke overstiger 4KB som standard bufferen i debian er for seriel), ellers må man skrue lidt på tiden.

select bruges som pseudo scheduler.
Avatar billede krukken Juniormester
07. oktober 2004 - 09:15 #19
Jeg håber du har ret med tiden:-) Men jeg kører kun med atn baudrate på 9600? Hvormange data kan der så flyttes over et serielt kabel på et sekund?
Avatar billede segmose Nybegynder
07. oktober 2004 - 10:05 #20
9600 baud er ca. 1KB/s så man kan sagtens nå at opsamle inddata. Håber bare at det er hurtigt nok til at få alle data inden for 1 sek.
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