Автор: Пользователь скрыл имя, 12 Марта 2012 в 16:03, курсовая работа
Целью данной курсовой работы является реализация приложения реализуещего задачу «взаимного исключения». Для достижения намеченной цели будет необходимо решение нескольких задач:
- изучение предметной области;
- изучение основных задач синхронизации: взаимное исключение,  производители-потребители, читатели-писатели;
- реализация решения задачи «взаимного исключения»;
Введение              3
1.Процессы              5
2. Задачи синхронизации             
3. Семафоры              19
4. Реализация приложения с использованием взаимного исключения.
Заключение
Список используемой литературы
Работа над курсовым проектом началась с подробного изучения потоков, семафоров и основных задач синхронизации. На основе появившихся знаний задача «взаимного исключения» была реализована с использованием семафоров.
После изучения основных задач синхронизации становится понятно, как работать с взаимодействующими потоками, что открывает новые возможности в программировании. В итоге, были улучшены знания работы по синхронизации потоков.
1. Lars Wirzenius "ОС Linux. Руководство системного администратора": Пер. с англ. – М.:: Издательский дом «Вильямс»,2004. – 752 с.: ил. – Парал. тит. англ.
2. Sven Goldt et al. "Энциклопедия программиста Linux"– Мн.: Харвест, 2003. – 384 с.:и: ил.
3. В. Г. Давыдов Технологии программирования C++ – СПб,: БВХ-Петербург, 2005 – 544 с.: ил.
Листинг 2. Решение задачи читателей/писателей  | 
 #include <pthread.h> #include <sched.h> #include <semaphore.h> #include <stdio.h> #include <unistd.h> 
 #define MAXTHREAD 10 /* define # readers */ 
 
 void access_database(); /* prototypes */ void non_access_database(); 
 void* reader(void*); void* writer(void*); 
 sem_t q; /* establish que */ int rc = 0; /* number of processes reading or wanting to */ int wc = 0; int write_request = 0; 
 int main() { pthread_t readers[MAXTHREAD],writerTh; int index; int ids[MAXTHREAD]; /* readers and initialize mutex, q and db-set them to 1 */ sem_init (&q,0,1); for(index = 0; index < MAXTHREAD; index ++) {         ids[index]=index+1;            if(pthread_create(& perror("Cannot create reader!");             exit(1);           } }     if(pthread_create(& perror("Cannot create writer"); /* create writers and error check */ exit(1); } 
     pthread_join(writerTh,0);  sem_destroy (&q); return 0; } 
 void* reader(void*arg) /* readers function to read */ { int index = *(int*)arg; int can_read; while(1){ can_read = 1; 
 sem_wait(&q); if(wc == 0 && write_request == 0) rc++;         else                   sem_post(&q); 
 if(can_read) { access_database(); printf("Thread %d reading\n", index); sleep(index); 
 sem_wait(&q); rc--; sem_post(&q); } 
 sched_yield(); } return 0; } ; void* writer(void*arg) /* writer's function to write */ { int can_write; while(1){ can_write = 1; non_access_database(); 
 sem_wait (&q); if(rc == 0) wc++; else { can_write = 0; write_request = 1; } sem_post(&q); 
 if(can_write) {             access_database(); printf("Writer is now writing...Number of readers: %d\n",rc); 
 sleep(3); 
 sem_wait(&q); wc--; write_request = 0; sem_post(&q); } 
 sched_yield(); } return 0; } 
 void access_database() { 
 } 
 
 void non_access_database() { 
 } 
  | 
Конец листинга 2.  | 
Информация о работе Взаимное исключение при взаимодействии процессов