Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Порядок выполнения. По аналогии потока 1 дописать второй поток, алгоритм которого приведен в примере

Читайте также:
  1. I. Задания для обязательного выполнения
  2. I. Задания для обязательного выполнения
  3. I. Задания для обязательного выполнения
  4. II. Порядок заповнення граф декларації громадянином
  5. II. Порядок и условия предоставления целевого жилищного займа для приобретения жилого помещения (жилых помещений) под залог приобретаемого жилого помещения (жилых помещений)
  6. II. Порядок поставки
  7. II. Порядок формирования экспертных групп, организация экспертизы заявленных на Конкурс проектов и регламент работы Конкурсной комиссии

По аналогии потока 1 дописать второй поток, алгоритм которого приведен в примере. Объяснить полученные результаты.

Осуществить выполнение программы без использования мьютексов.

2.2.8. Синхронизация с применением блокировки чтения‑записи.

Блокировки чтения – записи применяются в следующих случаях: когда несколько потребителей данных могут считывать информацию из выделенного ресурса в отсутствие источников данных, или когда один источник данных записывает информацию в ресурс при отсутствие других источников и потребителей данных.

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

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

Приведем пример с использованием блокировок чтения записи.

//rwlock.cpp

#include <time.h>

#include <sys/neutrino.h>

#include <pthread.h>

#include <stdio.h>

#include <unistd.h>

pthread_rwlock_t g_rwl;//глобальная переменная для использования блокириовок чтения-записи

unsigned char g_buff[256];//глобальный массив для чтения-записи данных

void *thread1(void *not_used)//чтение данных

{

while(1){

pthread_rwlock_rdlock(&g_rwl);//блокировка чтения данных

for(int i = 0; i < 10; i++){

printf("thread1: g_buff[%i] = %i \n", i, g_buff[i]);

sleep(2);

}

pthread_rwlock_unlock(&g_rwl);//разблокирование

}

}

 

 

void *thread2(void *not_used)//чтение данных

{

while(1){

//блокировка чтения данных

{

//цикл от 5 до 15

//печать строки "thread2: g_buff[%i] = %i \n", i, g_buff[i]

//приостановка на 1сек.

}

//разблокирование

}

}

void *thread3(void *not_used)//запись данных

{

int k = 0;

while(1){

pthread_rwlock_wrlock(&g_rwl);//блокировка записи данных

for(int i = 0; i < 10; i++){

g_buff[i] = i+k;

printf("thread3: g_buff[%i] = %i \n", i, g_buff[i]);

sleep(2);

}

k++;

pthread_rwlock_unlock(&g_rwl);//разблокирование

sleep(3);

}

}

 

void *thread4(void *not_used)//запись данных

{

int k = 0;

while(1){

//блокировка записи данных

{

//цикл от 5 до 15

//g_buff[i] = i+k+2;

//печать значения thread4: g_buff[%i] = %i \n", i, g_buff[i] //приостановка потока на 1сек.

}

k++;

//разблокирование

sleep(3);

}

}

int main() // игнорировать аргументы

{

time_t now;

char buf[27];

pthread_t thread_ids[4];

int threadcount;

pthread_attr_t attr;

pthread_attr_init(&attr);

pthread_attr_setinheritsched(&attr,PTHREAD_EXPLICIT_SCHED);

pthread_attr_setschedpolicy(&attr,SCHED_RR);

attr.param.sched_priority = 12;

 

pthread_rwlock_init(&g_rwl,NULL);//стандартная инициализация внутренних областей памяти для блокировок чтения-записи

// Создать четыре потока: thread1 thread2, thread3, thread4

pthread_create(&thread_ids[0],&attr,thread1,NULL)

pthread_create(&thread_ids[1],&attr,thread2,NULL)

pthread_create(&thread_ids[2],&attr,thread3,NULL)

pthread_create(&thread_ids[3],&attr,thread4,NULL)

sleep(100);

// Сейчас выполняются оба потока

pthread_rwlock_destroy(&g_rwl);//уничтожение блокировки чтения записи

return 0;

}

Задание 5

Цель работы — осуществить синхронизация с применением блокировки чтения-записи.


Дата добавления: 2015-12-08; просмотров: 52 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.007 сек.)