Чтение онлайн

на главную - закладки

Жанры

Системное программирование в среде Windows

Харт Джонсон М.

Шрифт:

Влияние синхронизации на производительность

Использование синхронизации в программах может и будет ухудшать их производительность, и в этом отношении следует быть особенно осмотрительным в случае SMP-систем. На первый взгляд, это противоречит здравому смыслу, поскольку от SMP-систем в целом можно было, бы ожидать только повышения производительности, а уж о том, что при переходе к ним быстродействие программ может снижаться, казалось бы, и речи идти не может. Тем не менее, в силу особенностей внутренних механизмов реализации, а также конкуренции между процессорами за право доступа к памяти могут наблюдаться неожиданные

эффекты, в том числе и резкое ухудшение производительности программы.

Достоинства и недостатки объектов CRITICAL_SECTION

Прежде всего, мы попытаемся количественно оценить влияние объектов синхронизации на производительность, и сравним между собой объекты CRITICAL_SECTION и мьютексы. В программе statsMX.c (программа 9.1) для синхронизации доступа к специфической для каждого потока структуре данных используется мьютекс. Программа statsCS.c, листинг которой здесь не приводится, но его можно найти на Web-сайте книги, делает точно то же, но с использованием объекта CRITICAL_SECTION, тогда как в программе stats IN. с для этого привлекаются функции взаимоблокировки (interlocked functions). Наконец, в программе statsNS.с, которая также здесь не приводится, синхронизация вообще не используется; оказывается, в данном примере можно вообще обойтись без синхронизации, поскольку каждый рабочий поток обращается к собственной уникальной области памяти. Некоторые предостережения по этому поводу приведены в конце данного раздела. В реальных программах количество рабочих потоков может быть неограниченным, однако для простоты в программе 9.1 обеспечивается поддержка 64 потоков.

Описанная совокупность программ не только позволяет оценить зависимость производительности от выбора конкретного типа объекта синхронизации, но и говорит о следующих вещах:

• При тщательном проектировании программы в некоторых случаях можно вообще обойтись без использования синхронизации. 

• В простейших ситуациях, например, когда требуется инкрементировать значение совместно используемой переменной, достаточно использовать функции взаимоблокировки.

• В большинстве случаев использование мьютексов обеспечивают более высокое быстродействие программы по сравнению с использованием объектов CS.

• Обычная методика заключается в определении структуры данных аргумента потока таким образом, чтобы она содержала информацию о состоянии, которая должна поддерживаться потоком, а также указатель на мьютекс или иной объект синхронизации.

Программа 9.1. statsMX: поддержка статистики потоков

/* Глава 9. statsMX.c */

/* Простая система "хозяин/рабочий", в которой каждый рабочий поток */

/* информирует главный поток о результатах своей работы для их отображения.*/

/* Версия, использующая мьютекс. */

#include "EvryThng.h"

#define DELAY_COUNT 20

/* Использование: statsMX nthread ntasks */

/* Запускается "nthread" рабочих потоков, каждой из которых поручается */

/* выполнение "ntasks" единичных рабочих заданий. Каждый поток сохраняет*/

/* информацию о выполненной работе в собственной неразделяемой ячейке */

/* массива, хранящего данные
о выполненной потоком работе. */

DWORD WINAPI worker(void *);

typedef struct _THARG {

 int thread_number;

 HANDLE *phMutex;

 unsigned int tasks_to_complete;

 unsigned int *tasks_complete;

} THARG;

int _tmain(DWORD argc, LPTSTR argv[]) {

 INT tstatus, nthread, ithread;

 HANDLE *worker_t, hMutex;

 unsigned int* task_count, tasks_per_thread;

 THARG* thread_arg;

 /* Создать мьютекс. */

 hMutex = CreateMutex(NULL, FALSE, NULL);

 nthread = _ttoi(argv[1]);

 tasks_per_thread = _ttoi(argv[2]);

 worker_t = malloc(nthread * sizeof(HANDLE));

 task_count = calloc(nthread, sizeof(unsigned int));

 thread_arg = calloc(nthread, sizeof(THARG));

 for(ithread = 0; ithread < nthread; ithread++) {

/* Заполнить данными аргумент потока. */

thread_arg[ithread].thread_number = ithread; 

thread_arg[ithread].tasks_to_complete = tasks_per_thread;

thread_arg[ithread].tasks_complete = &task_count[ithread];

thread_arg[ithread].phMutex = &hMutex;

worker_t[ithread] = (HANDLE)_beginthreadex (NULL, 0, worker, &thread_arg[ithread], 0, &ThId);

 }

 /* Ожидать завершения рабочих потоков. */

 WaitForMultipleObjects(nthread, worker_t, TRUE, INFINITE);

 free(worker_t);

 printf("Выполнение рабочих потоков завершено\n");

 for (ithread = 0; ithread < nthread; ithread++) {

_tprintf(_T("Количество заданий, выполненных потоком %5d: %6d\n"), ithread, task_count[ithread]);

 }

 return 0;

 free(task_count);

 free(thread_arg);

}

DWORD WINAPI worker(void *arg) {

 THARG * thread_arg;

 int ithread;

 thread_arg = (THARG*)arg;

 ithread = thread_arg->thread_number;

 while (*thread_arg->tasks_complete < thread_arg->tasks_to_complete) {

delay_cpu(DELAY_COUNT);

WaitForSingleObject(*(thread_arg->phMutex), INFINITE);

Поделиться:
Популярные книги

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Бальмануг. Студентка

Лашина Полина
2. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Бальмануг. Студентка

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Генерал-адмирал. Тетралогия

Злотников Роман Валерьевич
Генерал-адмирал
Фантастика:
альтернативная история
8.71
рейтинг книги
Генерал-адмирал. Тетралогия

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Защитник

Астахов Евгений Евгеньевич
7. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Защитник

Кодекс Охотника. Книга XIII

Винокуров Юрий
13. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XIII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Проклятый Лекарь IV

Скабер Артемий
4. Каратель
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Проклятый Лекарь IV

Жандарм 4

Семин Никита
4. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Жандарм 4

Тринадцатый V

NikL
5. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый V

Кодекс Охотника. Книга IV

Винокуров Юрий
4. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга IV

Энфис 2

Кронос Александр
2. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 2