Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <pthread.h>
- #include <semaphore.h>
- #ifndef __cplusplus
- typedef unsigned char bool;
- static const bool False = 0;
- static const bool True = 1;
- #endif
- #define N 2 /* Reizes cik biezi katrs no filozofiem megina est */
- #define P 5 /* Filozofu skaits*/
- sem_t Galds; /* Izmantojam semaforu ka galdu */
- sem_t Daksina[P]; /*Izmantojam semaforu ka daksinu */
- bool Switch ;
- void *tphilosopher(void *ptr) { /* Funkcija atspogulo, kada bridi filozofs megina izpildit kadu noteiktu darbibu*/
- int i, k = *((int *) ptr);
- for(i = 1; i <= N; i++) {
- printf("%*cFilozofs Doma %d %d\n", k*4, ' ', k, i); /* Pazinojuma izvade, ka filozofs sobrid doma */
- if(Switch) {
- sem_wait(&Galds) ; /*Semafora maina */
- }
- sem_wait(&Daksina[k]) ;
- sem_wait(&Daksina[(k+1) % P]) ;
- printf("%*cFilozofs Megina Est %d %d\n", k*4, ' ', k, i); /* Pazinojuma izvade, ka filozofs megina est*/
- sem_post(&Daksina[k]) ;
- sem_post(&Daksina[(k+1) % P]) ;
- if(Switch) {
- sem_post(&Galds) ;
- }
- }
- pthread_exit(0);
- }
- int main(int argc, char * argv[]) { /* Funkcija regule, kad daksinas ir brivas, lai neveidotos strupcels*/
- int i, targ[P];
- pthread_t thread[P];
- sem_init(&Galds, 0, P-1);
- Switch = (argc > 1); /* Galda semafors ieslegts/izslegts */
- printf("Switch=%s\n",(Switch?"true":"false"));
- for(i=0;i<P;i++) {
- sem_init(&Daksina[i], 0, 1);
- }
- for(i=0;i<P;i++) {
- targ[i] = i;
- pthread_create(&thread[i], NULL, &tphilosopher,(void *) &targ[i]); /* Semafora izveide, vertiba palielinas par 1 */
- }
- for(i=0;i<P;i++) {
- pthread_join(thread[i], NULL);
- }
- for(i=0;i<P;i++) {
- sem_destroy(&Daksina[i]); /*Semafors tiek iznicinats, vertiba samazinas par 1 */
- }
- sem_destroy(&Galds);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement