• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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]

http://pastebin.com/A2N5rXFM

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);
 

Timon3

Team ModMii

Registriert
17 Juli 2013
Beiträge
499
[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]
 

Skipjack

Neu angemeldet

Registriert
17 Juli 2013
Beiträge
213
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.
 

Captain_Obvious

Neu angemeldet

Registriert
15 Okt. 2013
Beiträge
37
Ort
127.0.0.1
  • 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]
 
Oben