Параллельная обработка односвязных кольцевых списков в памяти ОС Windows
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
lock(hp); //отмена блокировки кучи для других потоков
return false;
}= pq->beg;it_count = pq->nodes;(it_count > 0) //поиск элемента
{
if(curr->number != o) //если не нашли - движение дальше по списку
{= curr->next;
}//если нашли
{>number = n; //изменение значения элемента
cout << o << " changed to " << n << endl;
HeapUnlock(hp); //отмена блокировки кучи для других потоков
return true;
}_count--;
}<< "there is no such node in list, change failed" << endl;
HeapUnlock(hp); //отмена блокировки кучи для других потоков
return false;
}
Print(const List *pq, HANDLE hp)
{fl = HeapLock(hp); //блокировка доступа к куче списка других
потоков(fl == 0) //если блокировать не удалось
{<< "print failed" << endl;false;
}*curr;(pq->nodes == 0) //если список пуст
{<< "list is empty, there is nothing to print" << endl;
HeapUnlock(hp); //отмена блокировки кучи для других потоков
return false;
}= pq->beg;next;
while(curr != pq->beg) //вывод всех элементов списка на экран
{next;
}<< endl;
HeapUnlock(hp); //отмена блокировки кучи для других потоковtrue;
}
//---------------------------------------------------------------------------
//MAIN.CPP - тела главного и второстепенных потоков
//---------------------------------------------------------------------------
#include //подключение библиотек
#include
#include
#include
#include
#include
#include "header.h"
#include
#include
#include
#include
#include
#include
#include
#include namespace std;
int c = 0; //счетчик завершившихся потоков
ThreadAdd(void *p) //поток добавления узлов
{counter = 1;*pp = new Params();
pp = (Params*) p;(counter < 10) //добавление в указанный в параметрах список
элементов от 0 до 9
{(pp->pq,pp->hp,counter);
counter++;
}++; //инкремент счетчика завершившихся процессов
_endthread();
}
ThreadErase(void *p) //поток удаления элементов
{counter = 1;*pp = new Params();
pp = (Params*) p;(counter < 10) //удаление узла из указанного в параметрах списка
со значениями от 0 до 9
{(pp->pq,pp->hp,counter);
counter++;
}++; //инкремент счетчика завершившихся процессов
_endthread();
}
ThreadChange(void *p) //поток изменения элементов
{counter = 1;*pp = new Params();
pp = (Params*) p;(counter < 10) //изменение узла указанного в параметрах списка со
значениями от 0 до 9 путем прибавления к ним 1000
{(pp->pq,pp->hp,counter,counter+1000);
counter++;
}++; //инкремент счетчика завершившихся процессов
_endthread();
}
ThreadPrint(void *p) //поток вывода списка на экран
{counter = 0;*pp = new Params();
pp = (Params*) p;(counter < 10) //10 попыток вывести узлы списка на экран
{(pp->pq,pp->hp);
counter++;
}++; //инкремент счетчика завершившихся процессов
_endthread();
}
main()
{hp = NULL;q;= InitialList(&q,hp); //инициализация списка*p = new Params();>pq = &q;>hp = hp;
_beginthread(ThreadAdd, 2, (void*)(p)); //добавление второстепенных
потоков
_beginthread(ThreadErase, 2, (void*)(p));
_beginthread(ThreadChange, 2, (void*)(p));
_beginthread(ThreadPrint, 2, (void*)(p));(1) //ожидание завершения второстепенных потоков
{(c == 4)
{(&q,hp); //контрольное распечатывание списка
HeapDestroy(hp); //удаление кучи<< "heap destroyed" << endl;
break;
}
}
}