Параллельная обработка односвязных кольцевых списков в памяти ОС 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;

}

}

}