05.11.2013 Aufrufe

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

Zahn - Unix-Netzwerkprogramminerung mit Threads, Sockets und SSL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

1 #include <br />

2 #include <br />

3 #include <br />

4 #include <br />

5<br />

6 #define MAX_NUMBERS 10<br />

7 #define NUM_CONSUMERS 2<br />

8<br />

9 typedef struct intbuffer {<br />

10 int val[MAX_NUMBERS];<br />

11 int in, out;<br />

12 pthread_mutex_t mutex;<br />

13 pthread_cond_t add, rem;<br />

14 } intbuffer_t;<br />

15<br />

16 intbuffer_t data;<br />

Beispiel 3.6. average-mutex-cv.c, Teil 1<br />

3.2 Synchronisation 131<br />

17<br />

18 void error_exit( char *message , int status )<br />

19 {<br />

20 printf( "%s: %s\n", message , strerror( status ) );<br />

21 exit( EXIT_FAILURE );<br />

22 }<br />

23<br />

24 void *avg( void *arg )<br />

25 {<br />

26 int id = (int)arg;<br />

27 int sum = 0, num = 0, status;<br />

28<br />

29 for(;;) /* Endlosschleife */<br />

30 {<br />

31 /* exklusiven Zugriff auf data sicherstellen */<br />

32 status = pthread_mutex_lock( &data.mutex );<br />

33 if( status != 0 )<br />

34 error_exit( "pthread_mutex_lock()", status );<br />

35<br />

36 while( data.in == data.out ) /* solange Puffer leer */<br />

37 {<br />

38 /* auf neuen Wert warten , Mutex temporär freigeben */<br />

39 status = pthread_cond_wait( &data.add, &data.mutex );<br />

40 if( status != 0 )<br />

41 error_exit( "pthread_cond_wait()", status );<br />

42 }<br />

43<br />

44 /* Wert aufsummieren <strong>und</strong> Puffer weiterschalten */<br />

45 sum += data.val[data.out];<br />

46 data.out = ( data.out + 1 ) % MAX_NUMBERS;<br />

47

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!