Главная страница Взаимодействие нетривиальных процессов Листинг А.22 (продолжение) 45 Rw wrlock(&shared.rwlock): 46 shared.counter++; 47 Rw unlock(&shared.rwlock); 48 } 49 return(NULL); 50 } Семафоры Posix, размещаемые в памяти Мы измеряем скорость работы семафоров Posix (именованных и размещаемых в памяти). В листинге А.24 приведен текст функции mai п, а в листинге А.23 - текст функции incr. Листинг А.23. Увеличение счетчика с использованием семафоров Posix в памяти bench/i ПС r pxseml. с 37 void * 38 incrCvoid *arg) 39 { 40 i nt i; 41 for (i - 0; i < nloop: i++) { 42 Sem wait(&shared.mutex); 43 shared.counter++; 44 Seffl post(&shared.mutex); 45 } 46 return(NULL); 47 } Листинг A.24. Функция main для семафоров Posix, размещаемых в памяти bench/i nc r pxseml.с 1 #include unpipc.h 2 #define MAXNTHREADS 100 3 int nloop; 4 struct { 5 sem t mutex; /* размещаемый в памяти семафор */ 6 long counter; 7 } shared; 8 void *incr(void *); 9 int 10 mainCint argc, char **argv) 11 { 12 int i, nthreads; 13 pthread t tid[MAXNTHREADS]; 14 if (argc 1- 3) 15 err quit( usage; incr pxseml <#loops> <#threads> ); 16 nloop - atoi(argv[l]); 17 nthreads - min(atoi(argv[2]), MAXNTHREADS); 18 /* инициализация размещаемого в памяти семафора О */ 19 SemJnitC&shared.mutex, 0. 0): 20 /* создание всех потоков */ 21 Set concurrency(nthreads); 22 for (1 = 0: i < nthreads: i++) { 23 Pthread create(&tid[i]. NULL. incr. NULL): 24 } 25 /* запуск таймера и разблокирование семафора */ 26 Start time(): 27 Sem post(&shared.mutex): 28 /* ожидание завершения всех потоков */ 29 for (i = 0: i < nthreads; i++) { 30 PthreadJoin(tid[i], NULL); 31 } 32 printf( microseconds: %.0f usec\n . Stop time()); 33 if (shared.counter 1= nloop * nthreads) 34 printf( error: counter = Xld\n . shared.counter); 35 exit(O); 36 } 18-19 Создается семафор, инициализируемый значением 0. Второй аргумент в вызове semi nit, имеющий значение О, говорит о том, что семафор используется только потоками вызвавшего процесса. 20-27 После создания всех потоков запускается таймер и вызывается функция sem post. Именованные семафоры Posix В листинге А.26 приведен текст функции mai п, измеряющей быстродействие именованных семафоров Posix, а в листинге А.25 - соответствующая функция incr. Листинг А.25. Увеличение общего счетчика с использованием именованного семафора Posix bench/incr pxsem2.c 40 void * 41 incr(void *arg) 42 { 43 int i: 44 for (i - 0: i < nloop: i++) { 45 Sem wait(shared.mutex): 46 shared.counter++: 47 Sem post(shared.mutex): 48 } 49 return(NULL); 50 } Листинг A.26. Функция main для измерения быстродействия именованных семафоров Posix bench/incr pxsem2.c 1 #1nclude unpipc.h 2 #def1ne MAXNTHREADS 100 , продолжение Листинг А.26 (продолжение) 3 #define NAME incr pxsem2 4 int nloop: 5 struct { 6 sem t *mutex; /* указатель на именованный семафор */ 7 long counter; 8 } shared; 9 void *incr(void *); 10 int 11 mainCint argc, char **argv) 12 { 13 int 1, nthreads; 14 pthread t tid[MAXNTHREAOS]: 15 if (argc != 3) 16 err quit( usage: incr pxsem2 <#loops> <#threads> ); 17 nloop = atoi(argv[l]); 18 nthreads = min(atoi(argv[2]), MAXNTHREADS); 19 /* инициализация именованного семафора О */ 20 sem unlink(Px ipc name(NAME)): /* ошибка - OK */ 21 shared.mutex = Sem open(Pxjpc name(NAME). 0 CREAT OJXCL, FILE MODE, 0); 22 /* создание всех потоков */ 23 Set concurrency(nthreads): 24 for (i = 0; i < nthreads; i++) { 25 Pthread create(&tid[i]. NULL, incr. NULL); 26 } 27 /* запуск таймера и разблокирование семафора */ 28 Start time(): 29 Sem post(shared.mutex); 30 /* ожидание завершения всех потоков */ 31 for (i = 0; i < nthreads; 1++) { 32 PthreadJoin(tid[i]. NULL); 33 } 34 printfC microseconds: .Of usec\n , StopjimeO); 35 if (shared.counter != nloop * nthreads) 36 printfC error; counter = ld\n . shared.counter); 37 Sem unlink(Px ipc name(NAME)); 38 exitCO): 39 } Семафоры System V Функция main программы, измеряющей быстродействие семафоров System V, приведена в листинге А,27, а функция i пег показана в листинге А.28. Листинг А.27. Функция main для измерения быстродействия семафоров System V bench/i ncr svseml.с 1 #include unpipc.h 2 #define MAXNTHREADS 100
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |