Avatar billede soreno Praktikant
10. marts 2002 - 13:07 Der er 5 kommentarer og
2 løsninger

indkapsling af pthread i c++

jeg er ved at eksperimentere med lidt trådprogrammering på linux. Klassen er en delkomponent af en server baseret på sockets, og skal håndtere klientens forespørgsler.

Problemet ligger i pthread_create(..), jeg kan ikke få funktionen til at pege på run metoden (som er en friend funktion til klassen). Jeg har prøvet flere muligheder, men står lidt på bar bund.

Hvordan får jeg 3. parameter (i pthread_create(..)) til at acceptere run metoden, og hvordan skal 4. parameter se ud hvis der ikke skal overføres nogle argumenter (og hvordan skal den se ud hvis jeg vil overfører eks. en int) ?

#include <iostream>
#include "Handler.h" // indeholder kun prototyper, og en privat attribut: pthread_t thread;

Handler::Handler()
{
  pthread_create(&thread, NULL, run, NULL);
}

Handler::~Handler()
{
}

//defineret som en friend funktion
void run()
{
  std::cout << "thread: hello world" << std::endl;
}
Avatar billede laffe Nybegynder
11. marts 2002 - 12:10 #1
få du en kompileringsfejl ?
Avatar billede soreno Praktikant
11. marts 2002 - 16:04 #2
Fejl (med g++):
Handler.cpp: In method 'Handler::Handler ()':
Handler.cpp:6: cannot convert 'void (*) ()' to 'void *(*) (void*)' for argument '3' to 'pthread_create (pthread_t *, const pthread_attr_t *, void *(*) (void *), void *)'

og det kan jeg faktisk ikke helt fortolke, altså hvordan run() skal kaldes.
Avatar billede mickni33 Nybegynder
12. marts 2002 - 09:41 #3
Har prøvet det samme
Tror den bedste måde er at lave den som en fri funktion der virker den ihvertifald :-)

pthread_create er jo også en C funktion så der kan godt opstå problemer med at blande de to sprog med hinanden.

Husk meget vigtigt
brug ikke endl altså i cout<<endl
Det fungerer ikke med tråde brug istedet cout<<"\n"
Avatar billede soreno Praktikant
12. marts 2002 - 10:32 #4
hvad mener du med fri funktion... er det run() metoden eller hele klassen... ?

jeg vil gerne pakke tråden ind i klassen, da jeg ønsker en generel løsning jeg kan bruge i andre sammenhænge også.

Prototypen for pthread_create ser sådan ud:
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void *arg);

jeg kan ikke forstå hvordan 3 parameter skal forståes.. ?
Avatar billede soreno Praktikant
18. marts 2002 - 21:02 #5
jeg har stadig ikke løst det ... ;)
Avatar billede soreno Praktikant
22. marts 2002 - 13:33 #6
jeg opgiver (indtil videre :)
Avatar billede mickni33 Nybegynder
23. marts 2002 - 10:08 #7
Mærkeligt jeg har ikke fået nogle mails om at du havde kommentar??? sorry den lange ventetid.

Det er kun den enkelte funktion som skal være en fri funktion du behøver ikke at lave hele klassen fri.
en fri funktion er jo tilgængelig for alle. selvom der er irreterende at se på. :-)
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