![]() |
|
Модераторы: Poseidon |
![]()
|
|
| jonikmmm |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 4.12.2011 Репутация: нет Всего: нет |
Здравствуйте! Пожалуйста помогите разобраться с программой дубовиком.... мне нужно сдавать лабораторную, а я не знаю, что там и как....)))Об оплате договоримся... Нужно либо псевдо код написать либо в комментариях что и как работает, а еще потом по телефону объяснить или по скайпу...буду очень благодарен! Нужно срочно...Прикрепляю код:
Результаты работы программы Hi, I am odd thread with ID = 3067411312, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010 FileName = 3067411312, Number of written symbols = 6 Hi, I am even thread with ID = 3059018608, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010 FileName = 3067411312, Number of read symbols = 7 Hi, I am odd thread with ID = 3059018608, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010 FileName = 3059018608, Number of written symbols = 52 Hi, I am even thread with ID = 3067411312, PID = 2418, PPID = 2385, TIME = Wed Mar 24 02:04:26 2010 FileName = 3059018608, Number of read symbols = 53 Вот еще один дубовика с заданием: Задания на лабораторную работу: 1. Запустите несколько раз программу, приведенную в примере 6. Объясните письменно: 1) Результат работы программы. 2) Почему при запуске программы несколько раз и при увеличении числа потоков (NKIDS) получаются различные результаты? 2. Напишите программу, в которой: 1) запускается четное количество потоков; 2) каждый нечетный поток (например, первый) создает файл с именем из своего PID, записывает в него произвольное число символов и закрывает этот файл; 3) каждый четный поток (например, второй) открывает файл, созданный предыдущим потоком с нечетным номером (в нашем случае первым), читает его, считает количе- ство символов в файле и закрывает его; 4) каждый из потоков выводит следующую информацию: ThreadID, PID, PPID, время, имя файла, количество записанных или считанных символов. Количество пар создаваемых потоков передается аргументом в программу с командной строки. Программа должна ждать завершения работы всех потоков, анализировать и сооб- щать о причинах завершения потоков. Для передачи имен файлом между потоками можно использовать символьный массив в основной программе. 3. Ответьте письменно на вопрос: какие атрибуты потоков реализованы в библиотеке Pthreads (см. <pthread.h> и man pages). 1. #include <stdio.h> #include <pthread.h> #include <stdlib.h> int tot_items = 0 ; struct kidrec { int data ; pthread_t id ; }; #define NKIDS 50 void *kidfunc(void *p) { int *ip = (int *)p ; int tmp, n ; tmp = tot_items ; for (n = 0;n<50000;n++) tot_items = tmp + *ip; } main ( ) { kidrec kids[NKIDS] ; int m ; for (m=0; m<NKIDS; ++m) { kids[m].data = m+1 ; pthread_create (&kids[m].id, NULL, kidfunc, &kids[m].data); } for (m=0; m<NKIDS; ++m) pthread_join (kids[m].id, NULL) ; printf ("End of Program. Grand Total = %d\n", tot_items) ; } 2. #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/wait.h> #include <memory.h> #include <sys/types.h> void *rThreadFun(void *p); void *wThreadFun(void *p); class Buffer { public: int num; int in; int out; int finin; int finout; }; int main(int argc, char* argv[]) { srand48(time(NULL)); if(argc!=2) { printf("Error\n"); return 1; } int countp; sscanf(argv[1],"%d",&countp); if(countp>100) { printf("Error\n"); return 1; } int i,j,k; pthread_t *wThreads=new pthread_t[countp]; pthread_t *rThreads=new pthread_t[countp]; Buffer *wBuffers=new Buffer[countp]; Buffer *rBuffers=new Buffer[countp]; bool *wRes=new bool[countp]; bool *rRes=new bool[countp]; memset(wRes,1,countp); memset(rRes,1,countp); int *tpipe=new int[2]; int wi=0; int ri=0; for(i=0,j=0; i<countp; i++) { pipe(tpipe); wBuffers[i].num=j++; wBuffers[i].out=tpipe[0]; wBuffers[i].in=tpipe[1]; rBuffers[i].num=j++; rBuffers[i].out=tpipe[0]; rBuffers[i].in=tpipe[1]; lrand48(); pthread_create(&wThreads[i],NULL,wThreadFun,&(wBuffers[i])); lrand48(); pthread_create(&rThreads[i],NULL,rThreadFun,&(rBuffers[i])); } for(i=0; i<countp; i++) { pthread_join(wThreads[i],NULL); pthread_join(rThreads[i],NULL); } delete []wRes; delete []rRes; delete []tpipe; delete []wThreads; delete []rThreads; delete []wBuffers; delete []rBuffers; return 0; } void *wThreadFun(void *p) { int r=lrand48(); int pid; if(pid=fork()==0) { srand48®; Buffer *buffer=(Buffer*)p; close(buffer->out); time_t now; int i; unsigned char rnd; unsigned int sum=0; int index=buffer->num>>1; unsigned int tid=pthread_self(); char *name=new char[11]; memset(name,0,11); sprintf(name,"%u",tid); write(buffer->in,name,11); int file=creat(name,S_IRUSR|S_IWUSR); int count=lrand48()%200; flock sflock; sflock.l_type=F_WRLCK; sflock.l_whence=SEEK_SET; sflock.l_start=0; sflock.l_len=0; fcntl(file,F_SETLK,&sflock); char temp=1; write(buffer->in,&temp,1); for(i=0; i<count; i++) { sum+=rnd=rand(); write(file,&rnd,1); sflock.l_start++; fcntl(file,F_SETLK,&sflock); } sflock.l_type=F_UNLCK; sflock.l_start=0; fcntl(file,F_SETLK,&sflock); close(file); write(buffer->in,&temp,1); printf("num: %d, ",buffer->num); printf("ID: %u, ",tid); printf("PID: %d, ",getpid()); printf("PPID: %d, ",getppid()); printf("fname: %s, ",name); printf("count: %d, ",count); printf("sum: %d, ",sum); time(&now); printf("time: %s",ctime(&now)); delete []name; return 0; } waitpid(pid,NULL,NULL); pthread_exit(0); } void *rThreadFun(void *p) { int r=lrand48(); int pid; if(pid=fork()==0) { srand48®; Buffer *buffer=(Buffer*)p; close(buffer->in); char *name=new char[11]; read(buffer->out,name,11); time_t now; unsigned int sum=0; unsigned char buf; flock sflock; sflock.l_type=F_RDLCK; sflock.l_whence=SEEK_SET; sflock.l_start=0; sflock.l_len=1; int index=buffer->num>>1; unsigned int tid=pthread_self(); int count=0; char temp; read(buffer->out,&temp,1); int file=open(name,O_RDONLY); while(true) { fcntl(file,F_SETLKW,&sflock); if(read(file,&buf,1)) { count++; sum+=buf; sflock.l_start++; } else break; } close(file); read(buffer->out,&temp,1); unlink(name); printf("num: %d, ",buffer->num); printf("ID: %u, ",tid); printf("PID: %d, ",getpid()); printf("PPID: %d, ",getppid()); printf("fname: %s, ",name); printf("count: %d, ",count); printf("sum: %d, ",sum); time(&now); printf("time: %s",ctime(&now)); delete []name; return 0; } waitpid(pid,NULL,NULL); return 0; } 3. 1. Scope – область действия a. PTHREAD_SCOPE_SYSTEM поток планируется системным планировщиком и соревнуется за системные ресурсы с другими процессами b. PTHREAD_SCOPE_PROCESS поток планируется пользовательским планировщиком и, с точки зрения системы, считается частью своего процесса 2. Detachstate – присоединён/неприсоединён a. PTHREAD_CREATE_JOINABLE - ресурсы потока освобождаются после того, как другая нить вызовет pthread_join() b. PTHREAD_CREATE_DETACHED - ресурсы потока освобождаются сразу после завершения потока. 3. Stacksize - размер стека в байтах a. Размер стека в байтах b. 0 - система сама определяет размер стека. 4. Stackaddr - адрес стека a. Указатель на область памяти достаточную для размещения стека b. NULL - система должна выделить область под стек при создании потока 5. Concurrency (степень параллелизма) a. положительные целые числа 6. Schedpolicy - политика планирования a. SCHED_FIFO - соответствует планированию в порядке линейной очереди; потоки получают управление и отдают его только когда остановятся на примитиве синхронизации или вызовут sched_yield() b. SCHED_RR - соответствует планированию с квантами времени, когда потоки исполняются либо до момента явной отдачи управления, либо до истечения кванта времени. c. SCHED_OTHER соответствует системной политике планирования. d. TS – система оптимизирует среднее время реакции на внешние события. e. RT – используется статическая приоритизация. LWP реального времени исполняется до тех пор, пока не будет вытеснен LWP с более высоким приоритетом f. FSS – сложная схема динамической приоритизации, обеспечивающая определенным группам процессов гарантированную долю процессорного времени. 7. Inheritsched - наследование класса планирования a. PTHREAD_INHERIT_SCHED – наследовать, означает, что поток наследует класс планирования и приоритет от родительского потока b. PTHREAD_EXPLICIT_SCHED - задавать явно, означает, что класс планирования и приоритет вновь создаваемого потока должны быть указаны явно в атрибуте schedparam 8. Schedparam - параметры планирования a. struct sched_param определенная в <sched.h>, структура должна содержать поле sched_priority, соответствующее приоритету потока. 9. Guardsize - размер сторожевой области (защищена от чтения и записи, находится в начале стека) a. Размер сторожевой области в байтах b. 0 - сторожевую область выделять не надо. Можете либо позвонить на +79243118379, если сможете помочь, либо написать на [email protected]... также помогите выбрать код получше с точки зрения объяснения.... |
|||
|
||||
| Rodman |
|
|||
|
CIO ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 6144 Регистрация: 7.5.2006 Где: Ukraine ⇛ Kyiv ci ty Репутация: 26 Всего: 122 |
|
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |