Автор: Пользователь скрыл имя, 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. |
Информация о работе Взаимное исключение при взаимодействии процессов