ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 18.03.2024
Просмотров: 7
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define thinker 5
#define furcula 5
omp_lock_t forks[furcula];
void think(int i) {
int secs = 1 + (rand() % thinker+2300);
printf("Философ %d размышляет %d секунд...\n", i, secs);
Sleep(secs);
}
void eat(int i) {
int furcula_first;
int furcula_second;
if (i == thinker - 1) {
furcula_first = 0;
furcula_second = i;
}
else {
furcula_first = i;
furcula_second = i + 1;
}
printf("Философ %d просит вилку... у него %d вилка\n", i, furcula_first);
omp_set_lock(&forks[furcula_first]);
printf("Философ %d просит вилку ... у него %d вилка\n", i, furcula_second);
omp_set_lock(&forks[furcula_second]);
//симуляция процесса поедания пищи
int secs = rand() % thinker;
printf("Философ %d ест %d секунд\n...", i, secs);
omp_unset_lock(&forks[furcula_second]);
omp_unset_lock(&forks[furcula_first]);
}
void simulation(int i) {
while (true) {
think(i);
eat(i);
}
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i;
srand(time(NULL));
omp_set_num_threads(thinker);
for (int i = 0; i < thinker; i++) {
omp_init_lock(&forks[i]); // блокировка
}
#pragma omp parallel for private(i)
for (int i = 0; i < thinker; i++) {
simulation(i);
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
FILE* stream; // Файловый поток.
void printTimeStamp()
{
SYSTEMTIME timeStamp; // Текущее время.
GetLocalTime(&timeStamp); // Определить текущее время.
printf("%02d:%02d:%02d.%03d", // Вывести текущее время на экран.
timeStamp.wHour, timeStamp.wMinute,
timeStamp.wSecond, timeStamp.wMilliseconds);
fprintf(stream, "%02d:%02d:%02d.%03d", // Записать текущее время в файл.
timeStamp.wHour, timeStamp.wMinute,
timeStamp.wSecond, timeStamp.wMilliseconds);
}
void writer(int& storage, int totalWriters, int& activeReaders,
omp_lock_t& writeLock, bool& readLock)
{
#pragma omp parallel num_threads(totalWriters) // Создать параллельные
{ // потоки.
bool flag; // Переменная используется для того, чтобы подавить вывод повторных сообщений на экран и в файл, если писатель ожидает, пока читатели завершат работу с хранилищем.
int writerN = omp_get_thread_num(); // Определить номер
// потока-писателя.
while (true) // Выполнять в бесконечном
{ // цикле.
flag = false;
Sleep(rand() * writerN % 15000 + 3000);
#pragma omp critical // Вывести информацию на экран и в файл.
{
printTimeStamp();
printf(": Писатель %d перешел к хранилищу...\n", writerN);
fprintf(stream, ": Писатель %d перешел к хранилищу...\n",
writerN);
}
if (!omp_test_lock(&writeLock))
{
#pragma omp critical
{
printf("Другой писатель перешел к хранилищу раньше. ");
printf("Писатель %d ожидает.\n", writerN);
fprintf(stream,
"Другой писатель перешел к хранилищу раньше. ");
fprintf(stream, "Писатель %d ожидает.\n", writerN);
}
omp_set_lock(&writeLock); // Заблокировать текущий поток.
}
readLock = true; // Запретить доступ к хранилищу
// новым читателям.
while (activeReaders != 0)
{
if (!flag) // Если информация ещё не выводилась,
{
#pragma omp critical
{
printf("Писатель %d ожидает, пока ", writerN);
printf(" читатели закончат работу с хранилищем.\n");
fprintf(stream,
"Писатель %d ожидает, пока ", writerN);
fprintf(stream,
" читатели закончат работу с хранилищем.\n");
}
}
flag = true; // Отметить факт вывода информации.
Sleep(100);
}
#pragma omp critical
{
printTimeStamp();
printf(": У Писателя %d появился доступ к хранилищу.\n", writerN);
fprintf(stream,
": У Писателя %d появился доступ к хранилищу.\n", writerN);
}
Sleep(3000);
storage = rand() + writerN;
#pragma omp critical
{
printTimeStamp();
printf(": Писатель %d сделал запись в хранилище ", writerN);
printf("письмо %d и закончил работу.\n", storage);
fprintf(stream,
": Писатель %d сделал запись в хранилище ", writerN);
fprintf(stream,
"письмо %d и закончил работу.\n", storage);
}
readLock = false;
omp_unset_lock(&writeLock);
}
}
}
/*************************************************************************/
void reader(int& storage, int totalReaders, int& activeReaders,
bool& readLock)
{
#pragma omp parallel num_threads(totalReaders) // Создать параллельные
{ // потоки.
bool flag;
int readerN = omp_get_thread_num();
// потока-читателя.
while (true)
{
flag = false;
Sleep(rand() * readerN % 12000 + 3000);
#pragma omp critical
{
printTimeStamp();
printf(": Читатель %d перешел к хранилищу...\n", readerN);
fprintf(stream,
": Читатель %d перешел к хранилищу...\n", readerN);
}
while (readLock == true) // Дождаться доступа к хранилищу.
{
if (!flag)
{
#pragma omp critical
{
printf("Доступ к хранилищу заблокирован. ");
printf("Читатель %d ожидает.\n", readerN);
fprintf(stream,
"Доступ к хранилищу заблокирован. ");
fprintf(stream,
"Читатель %d ожидает.\n", readerN);
}
}
flag = true; // Отметить факт вывода информации.
Sleep(100);
}
#pragma omp critical
{
printTimeStamp();
printf(": У Читателя %d появился доступ к хранилищу.\n", readerN);
fprintf(stream,
": У Читателя %d появился доступ к хранилищу.\n", readerN);
}
#pragma omp atomic
activeReaders++; // Увеличить количество активных читателей.
Sleep(3000);
#pragma omp critical
{
printTimeStamp();
printf(": Читатель %d прочитал из хранилища ", readerN);
printf("текст %d и закончил работу.\n", storage);
fprintf(stream,
": Читатель %d прочитал из хранилища ", readerN);
fprintf(stream,
"текст %d и закончил работу.\n", storage);
}
#pragma omp atomic
activeReaders--;
}
}
}
void main()
{
double start_time = 0.0, end_time = 0.0, s1 = 0.0, s2 = 0.0;
setlocale(LC_ALL, "Russian");
srand(time(NULL));
int storage = 0; // Хранилище.
int totalWriters = 0,
totalReaders = 0;
int activeReaders = 0;
omp_lock_t writeLock; // Замок для блокировки писателей.
bool readLock = false; // Переменная для блокировки читателей:
// true - чтение запрещено;
// false - чтение разрешено.
fopen_s(&stream, "log.txt", "w");
omp_init_lock(&writeLock); // Инициализировать замок.
omp_set_nested(true);
printf("Ввести число писателей: ");
cin >> totalWriters;
printf("Ввести число читателей: ");
cin >> totalReaders;
#pragma omp parallel sections
{
#pragma omp section
{
writer(storage, totalWriters, activeReaders,
writeLock, readLock);
}
#pragma omp section // Вызвать процедуру моделирования
{
reader(storage, totalReaders, activeReaders,
readLock);
}
}
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
FILE* stream; // Файловый поток.
void printTimeStamp()
{
SYSTEMTIME timeStamp; // Текущее время.
GetLocalTime(&timeStamp); // Определить текущее время.
printf("%02d:%02d:%02d.%03d", // Вывести текущее время на экран.
timeStamp.wHour, timeStamp.wMinute,
timeStamp.wSecond, timeStamp.wMilliseconds);
fprintf(stream, "%02d:%02d:%02d.%03d", // Записать текущее время в файл.
timeStamp.wHour, timeStamp.wMinute,
timeStamp.wSecond, timeStamp.wMilliseconds);
}
void writer(int& storage, int totalWriters, int& activeReaders,
omp_lock_t& writeLock, bool& readLock)
{
#pragma omp parallel num_threads(totalWriters) // Создать параллельные
{ // потоки.
bool flag; // Переменная используется для того, чтобы подавить вывод повторных сообщений на экран и в файл, если писатель ожидает, пока читатели завершат работу с хранилищем.
int writerN = omp_get_thread_num(); // Определить номер
// потока-писателя.
while (true)
{
flag = false;
Sleep(rand() * writerN % 15000 + 3000);
#pragma omp critical // Вывести информацию на экран и в файл.
{
printTimeStamp();
printf(": Писатель %d перешел к хранилищу...\n", writerN);
fprintf(stream, ": Писатель %d перешел к хранилищу...\n",
writerN);
}
if (!omp_test_lock(&writeLock)) //проверка состояния замка без блокировки текущего процесса
{
#pragma omp critical
{
printf("Другой писатель перешел к хранилищу раньше. ");
printf("Писатель %d ожидает.\n", writerN);
fprintf(stream,
"Другой писатель перешел к хранилищу раньше. ");
fprintf(stream, "Писатель %d ожидает.\n", writerN);
}
omp_set_lock(&writeLock); // Заблокировать текущий поток.
}
readLock = true; // Запретить доступ к хранилищу
// новым читателям.
while (activeReaders != 0)
{
if (!flag) // Если информация ещё не выводилась,
{
#pragma omp critical
{
printf("Писатель %d ожидает, пока ", writerN);
printf(" читатели закончат работу с хранилищем.\n");
fprintf(stream,
"Писатель %d ожидает, пока ", writerN);
fprintf(stream,
" читатели закончат работу с хранилищем.\n");
}
}
flag = true; // Отметить факт вывода информации.
Sleep(100);
}
#pragma omp critical
{
printTimeStamp();
printf(": У Писателя %d появился доступ к хранилищу.\n", writerN);
fprintf(stream,
": У Писателя %d появился доступ к хранилищу.\n", writerN);
}
Sleep(3000);
storage = rand() + writerN;
#pragma omp critical
{
printTimeStamp();
printf(": Писатель %d сделал запись в хранилище ", writerN);
printf("письмо %d и закончил работу.\n", storage);
fprintf(stream,
": Писатель %d сделал запись в хранилище ", writerN);
fprintf(stream,
"письмо %d и закончил работу.\n", storage);
}
readLock = false;
omp_unset_lock(&writeLock);
}
}
}
/*************************************************************************/
void reader(int& storage, int totalReaders, int& activeReaders,
bool& readLock)
{
#pragma omp parallel num_threads(totalReaders) // Создать параллельные
{ // потоки.
bool flag;
int readerN = omp_get_thread_num();
// потока-читателя.
while (true)
{
flag = false;
Sleep(rand() * readerN % 12000 + 3000);
#pragma omp critical
{
printTimeStamp();
printf(": Читатель %d перешел к хранилищу...\n", readerN);
fprintf(stream,
": Читатель %d перешел к хранилищу...\n", readerN);
}
while (readLock == true) // Дождаться доступа к хранилищу.
{
if (!flag)
{
#pragma omp critical
{
printf("Доступ к хранилищу заблокирован. ");
printf("Читатель %d ожидает.\n", readerN);
fprintf(stream,
"Доступ к хранилищу заблокирован. ");
fprintf(stream,
"Читатель %d ожидает.\n", readerN);
}
}
flag = true; // Отметить факт вывода информации.
Sleep(100);
}
#pragma omp critical
{
printTimeStamp();
printf(": У Читателя %d появился доступ к хранилищу.\n", readerN);
fprintf(stream,
": У Читателя %d появился доступ к хранилищу.\n", readerN);
}
#pragma omp atomic
activeReaders++; // Увеличить количество активных читателей.
Sleep(3000);
#pragma omp critical
{
printTimeStamp();
printf(": Читатель %d прочитал из хранилища ", readerN);
printf("текст %d и закончил работу.\n", storage);
fprintf(stream,
": Читатель %d прочитал из хранилища ", readerN);
fprintf(stream,
"текст %d и закончил работу.\n", storage);
}
#pragma omp atomic
activeReaders--;
}
}
}
void main()
{
setlocale(LC_ALL, "Russian");
srand(time(NULL));
int storage = 0; // Хранилище.
int totalWriters = 0,
totalReaders = 0;
int activeReaders = 0;
omp_lock_t writeLock; // Замок для блокировки писателей.
bool readLock = false; // Переменная для блокировки читателей:
// true - чтение запрещено;
// false - чтение разрешено.
fopen_s(&stream, "log.txt", "w");
omp_init_lock(&writeLock); // Инициализировать замок.
omp_set_nested(true);
printf("Ввести число писателей: ");
cin >> totalWriters;
printf("Ввести число читателей: ");
cin >> totalReaders;
#pragma omp parallel sections
{
#pragma omp section
{
writer(storage, totalWriters, activeReaders,
writeLock, readLock);
}
#pragma omp section // Вызвать процедуру моделирования
{
reader(storage, totalReaders, activeReaders,
readLock);
}
}
}