Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Threads anlegen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.02.2004, 19:19 Uhr
~tommileinspilot
Gast


Hallo!
Ich bin relat. neu in Linux.
Ich würde gern wissen wie man unter Linux in C/C++ einen
Thread oder einen vergleichbaren Prozessabschnitt anlegt.
Gerne auch Hinweise, wo das genau dokumentiert ist.
Habt vielen Dank!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.02.2004, 20:54 Uhr
kronos
Quotenfisch
(Operator)


hi!
linux kann forks, das ist die traditionelle "harte tour" um einen prozess abzuspalten. ein fork erstellt eine kopie des prozesses, die genau dort weiterläuft wo fork aufgerufen wurde. anhand des rückgabe-wertes kannst du feststellen, ob du dich im neuen oder im alten prozess befindest.
außerdem gibt's POSIX-threads, die sind der windows-thread-API vom gebrauch recht ähnlich. ich bevorzuge diese, weil's schlichtweg einfacher ist, was genau für forks spricht weiß ich nicht...
wenn du dokumentation suchst, sind deine erste anlaufstelle unter linux meist die man-pages. in diesem fall z.b.:

Code:
man fork
man pthread_create

oder so...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2004, 13:41 Uhr
~tommileinspilot
Gast


Danke erst mal!
Aber kann mir jemand vielleicht
ein par zeilen Beispielcode zuschicken für
die Belegeung der Fuc pthread_create mit Argumenten und
einer "sleep" -Func?
(zb. soll eine Schleife alle Sekunde etwas tun)
Danke euch!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2004, 15:27 Uhr
kronos
Quotenfisch
(Operator)


hmm...

C++:
void ThreadFunc();

main()
{
    int c,thread_id;
    pthread_create(&thread_id, 0,ThreadFunc,0);
    for(c=0;c++<10;sleep(2))puts("main: Nerv mich net!");
}

void ThreadFunc()
{
    while("hunger")
    {
    puts("Thread: Ich will was zu essen!");
    sleep(1);
    }
}


sowas?
ist immer schwer das zu treffen, was du brauchst, versuch's einfach mal selbst und poste deinen code wenn du nicht weiter kommst...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2004, 13:47 Uhr
~tommileinspilot
Gast


Danke, hat mir schon sehr geholfen, nur das ich
"nanosleep(...)" verwenden musste, weil "sleep(...)"
nicht erkannt wurde(?).
Jetzt brauche ich nur noch eine Func., welche
die Prozessorzeit seit Programmstart misst.
(entsprechend "GetTickCount() bei Win).
Ach, und vielleicht eine Codezeile über die Verwendung
einer Realtime-Priorität.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.03.2004, 15:26 Uhr
kronos
Quotenfisch
(Operator)


sleep ist in der unistd.h deklariert und kein ansi, glaube ich. müsste aber dabei sein, was für 'ne distri hast du denn am start?
ticks ab programmstart... schau' dich mal in time.h um... ich glaube clock() heißt das ding.
mit echtzeit-programmierung unter linux kann ich dir leider nicht dienen.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.03.2004, 17:14 Uhr
0xdeadbeef
Gott
(Operator)


Was die Ticks angeht, je nachdem, was du damit machen willst, wird für dich wohl eine der Funktionen time oder gettimeofday interessant sein. time gibt die Anzahl der Sekunden seit dem 1. Januar 1970, 0:00 UTC ("The Epoch") zurück, gettimeofday löst auch Millisekunden auf und gibt dir eine Info über die Zeitzone, in der deine Uhr tickt, ist aber dementsprechend komplizierter zu benutzen.

C++:
time_t t;

t = time(0);
if(t == ((time_t) -1)) printf("Fehler! errno == %d\n", errno);
else printf("Sekunden seit 1.1. 1970 0:00 UTC: %ld\n", t);
/* oder, alternativ: */
if(time(&t) == ((time_t) -1) printf("Fehler! errno == %d\n", errno);
else printf("Sekunden seit 1.1. 1970 0:00 UTC: %ld\n", t);

/*****************************************/
struct timeval tv;
struct timezone tz;
if(gettimeofday(&tv, &tz) == -1) printf("Fehler! errno == %d\n", errno);
else printf("Zeit seit 1.1.1970 0:00 UTC: %ld Sekunden, %ld Millisekunden\n", tv->tv_sec, tv->tv_usec);


Das timezone-struct ist im wesentlichen aus Kompatibilitätsgründen zu BSD 4.3 da und obsolet, ich würde dir raten, es nicht zu benutzen.

Was die Realtime-Priorität angeht, das nennt sich unter Unix "nice level". Ein geringerer nice-level bedeutet eine höhere Priorität. Auslesen und verändern kannst du den nice-level mit den Funktionen getpriority, setpriority und nice. Die Prototypen der Funktionen sind:

C++:
int getpriority(int which, int who);
int setpriority(int which, int who, int prio);

int nice(int inc);


Bei set/getpriority ist which einer der Werte PRIO_PROCESS, PRIO_PGRP, oder PRIO_USER, je nachdem, wessen Priorität du ändern willst. who ist der entsprechende identifier, und prio im Fall von setpriority der nice-level (ein Wert zwischen -20 und 19). getpriority gibt den nice-level zurück und -1, wenn ein Fehler auftritt. VORSICHT! Bei getpriority ist -1 auch ein legaler Rückgabewert, also vorher errno auf 0 setzen und nachher überprüfen, ob sich der Wert geändert hat. setpriority gibt 0 bei Erfolg und -1 bei einem Fehler zurück, errno wird entsprechend gesetzt.

nice funktioniert im Grunde wie setpriority, nur dass der Prozess seine eigene Priorität ändert und die Zahl entgegennimmt, um die der nice-level erhöht werden soll. Negative Werte sind nur für den Superuser erlaubt. Die Rückgabewerte entsprechen denen von setpriority.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 02.03.2004 um 17:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: