
- •Предисловие
- •Системы реального времени
- •1.1. Особенности систем реального времени
- •2.Аппаратурная среда систем реального времени летательных аппаратов.
- •1.3. Требования к срв ла
- •1.4. Передача данных
- •1.4.1. Синхронная передача данных
- •1.4.2. Асинхронная передача данных
- •1.5. Концепция процесса, потока
- •3.Архитектуры ос рв и ядро ос рв
- •1.6.1. Ядро ос рв
- •1.6.2. Планирование заданий и загрузки процессоров
- •4.Механизмы синхронизации и взаимодействия процессов, потоков
- •1.7.1. Средства синхронизации с помощью таймеров.
- •1.7.2. Синхронизация процессов в Windows 2000, Windows xp с использованием событий
- •1.7.3. Использование семафора для синхронизации работы потоков
- •1.8. Программирование синхронной и асинхронной обработки данных
- •1.8.1. Асинхронная обработка данных
- •1.8.2. Синхронная обработка данных
- •2.1.3. Контрольные вопросы
- •6.Синхронизация потоков с использованием методов «Присоединение», «Барьер», «Мьютекс» и «Блокировки чтения - записи»
- •2.2.1. Порядок выполнения работы
- •2.2.2. Методические указания
- •2.2.3. Задание 1
- •2.2.4. Задание 2
- •2.2.5. Задание 3
- •2.2.6. Синхронизация потоков с использованием мьютексов
- •2.2.7. Задание 4
- •2.2.8. Синхронизация с применением блокировки чтения‑записи.
- •2.2.9. Задание 5
- •2.2.10. Задание 6
- •2.2.11. Контрольные вопросы
- •7.Взаимодействие между процессами с помощью сообщений. Модель «клиент/сервер». Таймеры
- •2.3.1. Порядок выполнения работы
- •2.3.2. Методические указания
- •2.3.3. Задание 7
- •2.3.4. Задание 8
- •2.3.5. Задание 9
- •2.3.6. Задание 10
- •2.4.2. Методические указания
- •2.4.3. Задание 16
- •2.4.4. Задание 17
- •2.4.5. Задание 18
- •2.4.6. Задание 19
- •2.4.7. Задание 20
- •2.4.8. Задание 21
- •2.4.9. Задание 22
- •2.4.15. Контрольные вопросы
- •Библиографический список
- •Оглавление
- •5. Установка ос qnx 48
- •6. Синхронизация потоков с использованием методов «Присоединение», «Барьер», «Мьютекс» и «Блокировки чтения - записи» 59
- •7. Взаимодействие между процессами с помощью сообщений. Модель «клиент/сервер». Таймеры 70
2.2.7. Задание 4
Цель работы — осуществить синхронизацию работы потоков с помощью мьютекса.
Порядок выполнения
По аналогии потока 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;
}