Взаимное исключение при взаимодействии процессов

Автор: Пользователь скрыл имя, 12 Марта 2012 в 16:03, курсовая работа

Описание работы

Целью данной курсовой работы является реализация приложения реализуещего задачу «взаимного исключения». Для достижения намеченной цели будет необходимо решение нескольких задач:
- изучение предметной области;
- изучение основных задач синхронизации: взаимное исключение, производители-потребители, читатели-писатели;
- реализация решения задачи «взаимного исключения»;

Содержание

Введение 3
1.Процессы 5
2. Задачи синхронизации
3. Семафоры 19
4. Реализация приложения с использованием взаимного исключения.
Заключение
Список используемой литературы

Работа содержит 1 файл

Курсовая третий курс!!!!!!!!! - копия.doc

— 198.50 Кб (Скачать)

Работа над курсовым проектом началась с подробного изучения потоков, семафоров и основных задач синхронизации. На основе появившихся знаний задача «взаимного исключения» была реализована с использованием семафоров.

После изучения основных задач синхронизации становится понятно, как  работать с взаимодействующими потоками, что открывает новые возможности в программировании. В итоге, были улучшены знания работы по синхронизации потоков.


Список используемой литературы

 

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;                             /* create readers and error check */

        if(pthread_create(&readers[index],0,reader,&ids[index])!=0){

            perror("Cannot create reader!");

            exit(1);                           

        }

    }

    if(pthread_create(&writerTh,0,writer,0)!=0){

        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                               can_read = 0;

        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.

 

 



Информация о работе Взаимное исключение при взаимодействии процессов