pthreads was mache ich falsch?

Captain_Obvious

Neu angemeldet
Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
Ich komme mal wieder nicht wirklich weiter und zwar diesmal mit pthreads ich vermute der Fehler ist jedes mal der selbe und wahrscheinlich ziemlich dämlich aber ich hab ihn bisher nicht entdecken können wenn jemand eine Idee hat wäre ich für einen Tipp dankbar ;)


Aufgabenstellung:
globale Variabelen i und j, i wird mit 1 initiallisiert Hauptthread soll zwei threads starten die jeweils i mitgegeben bekommen

thread 1:
Ausgabe tread id
3sec warten
Ausgabe var i und j

thread 2:
Ausgabe tread id
Endlosschleife i++ und j++ anschließende Ausgabe und 1 sec blokieren

Hauptthread:
Ausgabe Thread ID + Thread id der beiden anderen threads
warten auf thread 1
Ausgabe i und j
kill thread 2
[src=c]#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int j=1;
//void Kind1 ();
//void Kind2 ();
int thread1 (int *i);
int thread2 (int *i);
int TID1, TID2; // Thread IDs der Kinder

void main (void){
//int thread1,thread2;
int *i=1;
int x;
int pthread_create(pthread_t *thread, NULL, int thread1 (int *i));
int pthread_join (pthread_t thread, TID1);
int pthread_create(pthread_t *thread, NULL, int thread2 (int *i));
int pthread_cancel(pthread_t thread);
printf("Eltern PID = %i\n",system("getpid"));
printf("Kind1 Thread ID = %i\n", TID1);
printf("Kind2 Thread ID = %i\n", TID2);
for (x=0;x<3;x++)
{
sleep(1);
printf("Var i = %i\n",i);
system("ps");
};
//kill (pid_2);
}

int thread1 (int *i)
{
printf("Hier ist Thread 1\n");
printf("PID = %i\n",system("getpid"));
//int i;
sleep(3);
printf("Schlafen beendet\n");
printf("var i = %i\n", i);
printf("var j = %i\n", j);
TID1 = pthread_self();
return TID1;
}

int thread2 (int *i)
{
printf("Eltern PID = %i\n",system("getppid"));
printf("Hier ist Thread 1\n");
printf("PID = %i\n",system("getpid"));
int y=1;
//int i;
do {
i++;
j++;
}
while (y=1);
printf("var i = %i\n", i);
printf("var j = %i\n", j);
wait(1);
TID2 = pthread_self();
return TID2;
}[/src]



output vom gcc:

gcc -o BSY2-03 BSY2-03.c -pthread
BSY2-03.c: In function ‘main’:
BSY2-03.c:16:10: warning: initialization makes pointer from integer without a cast [enabled by default]
int *i=1;
^
In file included from /usr/include/unistd.h:226:0,
from BSY2-03.c:4:
BSY2-03.c:18:41: error: expected declaration specifiers or ‘...’ before ‘(’ token
int pthread_create(pthread_t *thread, NULL, int thread1 (int *i));
^
BSY2-03.c:19:39: error: expected declaration specifiers or ‘...’ before ‘TID1’
int pthread_join (pthread_t thread, TID1);
^
In file included from /usr/include/unistd.h:226:0,
from BSY2-03.c:4:
BSY2-03.c:20:41: error: expected declaration specifiers or ‘...’ before ‘(’ token
int pthread_create(pthread_t *thread, NULL, int thread2 (int *i));
^
BSY2-03.c:28:5: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("Var i = %i\n",i);
^
BSY2-03.c: In function ‘thread1’:
BSY2-03.c:41:3: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("var i = %i\n", i);
^
BSY2-03.c: In function ‘thread2’:
BSY2-03.c:59:3: warning: format ‘%i’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("var i = %i\n", i);
 
[src=c]int pthread_create(pthreat_t *thread, NULL, int thread1 (int *i));[/src]

Was beabsichtigst du mit der Zeile? Es scheint so, als wolltest du die Funktion neu deklarieren, was aber in einem anderen Funktionskörper keinen Sinn ergibt. Du musst einfach einen normalen Aufruf machen mittels

[src=c]pthrad_create(*thread, NULL, thread1(*i));[/src]
 
Ich komme mal wieder nicht wirklich weiter und zwar diesmal mit pthreads ich vermute der Fehler ist jedes mal der selbe und wahrscheinlich ziemlich dämlich aber ich hab ihn bisher nicht entdecken können
Was ist denn genau Dein Problem? Die Compiler-Error/Warnungen?
So richtig viel mit C hast Du bisher aber noch nicht gearbeitet, oder?
Lies doch mal genau und fang oben an:

warning: initialization makes pointer from integer without a cast [enabled by default]
int *i=1;

Naja, Du deklarierst einen Pointer und weist diesem die Zahl 1 zu? Wenn überhaupt müsste es wohl eher
[src=c]int j=1;
int *i = &j;[/src]
heissen, aber im weiteren wirst Du wohl eher
[src=c]int i=1;[/src]
benötigen.

Was soll denn eigentlich
[src=c]int pthread_create(pthread_t *thread, NULL, int thread1 (int *i));[/src] und die folgenden 3 Zeilen bewirken?
Mit dem int beginnt eine Variablendeklaration, aber doch kein Funktionsaufruf.

Und der Aufruf von pthread_create: also das pthread_create, dass ich kenne, hat die Schnittstelle
[src=c]int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);[/src]
und damit wäre der Aufruf bei Dir wohl eher
[src=c]pthread_t thread;
pthread_create(&thread, NULL, thread1, &i);[/src]
allerdings passt da der Prototyp deiner thread1 Routine noch nicht ganz.

Fang damit mal an.
 
  • Thread Starter Thread Starter
  • #4
Hab es mittlerweile rausbekommen hier mal die richtige Lösung^^ danke für die Tips ;)

[src=c]#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>

int j=1;
//void Kind1 ();
//void Kind2 ();
void *thread1 (void *i);
void *thread2 (void *i);
int TID1, TID2; // Thread IDs der Kinder

int main (void){
//int thread1,thread2;
int i=1;
int x;
pthread_t p1, p2;
pthread_create(&p1, NULL, thread1, (void*)&i);
pthread_create(&p2, NULL, thread2, (void*)&i);

printf("Eltern PID e = %i\n",getpid());
printf("Kind1 Thread ID = %i\n", p1);
printf("Kind2 Thread ID = %i\n", p2);
for (x=0;x<3;x++)
{
sleep(1);
printf("Var i e= %i\n",i);
system("ps");
};
printf("var i e= %i\n", i);
printf("var j e= %i\n", j);
pthread_join (p1, NULL);
pthread_cancel(p2);
return 0;
}

void *thread1 (void *i)
{
printf("Hier ist Thread 1\n");
printf("PID = %i\n",getpid());
sleep(3);
printf("Schlafen beendet\n");
printf("var i 1 = %i\n",*(int*) i);
printf("var j 1 = %i\n", j);
TID1 = pthread_self();
pthread_exit(NULL);
}

void *thread2 (void *i)
{
printf("Eltern PID 2 = %i\n",getppid());
printf("Hier ist Thread 2\n");
printf("PID = %i\n",getpid());
int y=1;
TID2 = pthread_self();
do {
(*(int*) i)++;
j++;
sleep(1);
wait(1);
}
while (y=1);
pthread_exit(NULL);
}
[/src]
 
Zurück
Oben