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

на главную

Жанры

QNX/UNIX: Анатомия параллелизма
Шрифт:

unsigned int T = 2;

static sem_t* sem;

static bool debug = false;

static char* str; // строка диагностики

static volatile int ind = 0;

uint64_t *t;

void* threadfunc(void* data) {

unsigned long i = 0;

char tid[8];

sprintf(tid, "%X", pthread_self);

//
временная метка начала во всех потоках устанавливается

// на время достижения этой точки в последнем (активном) потоке

if ((int)data == T - 1) {

uint64_t с = ClockCycles;

for (int i = 0; i < T; i++ ) t[i] = c;

}

// рабочий цикл переключений за счет синхронизации

while (i++ < N) {

sem_wait(sem + (int)data);

if (debug) str[ind++] = *tid;

sem_post(sem + ((int)data +1) % T);

}

t[(int)data] = ClockCycles - t[(int)data];

return NULL;

}

int main(int argc, char *argv[]) {

int opt, val;

while ((opt = getopt(argc, argv, "n:t:v")) != -1) {

switch(opt) {

case 'n':

if (sscanf(optarg, "%i", &val) != 1)

cout << "parse command line error" << endl, exit(EXIT_FAILURE);

if (val > 0) N — val;

break;

case 't':

if (sscanf(optarg, "%i", &val) != 1)

cout << "parse command line error" << endl, exit(EXIT_FAILURE);

if (val > 0) T = val;

break;

case 'v':

debug = true;

break;

default:

exit(EXIT_FAILURE);

}

}

if (debug) str = new char[T * N + 1];

pthread_t* tid = new pthread_t[T];

sem = new sem_t[T];

t = new uint64_t[T];

for (int i = 0; i < T; i++) {

// все потоки, кроме последнего, будут заблокированы

// на своих семафорах сразу же после старта

if (sem_init(sem + i, 0, (i == (T - 1)) ? 1 : 0))

perror("semaphore init"), exit(EXIT_FAILURE);

if (pthread_create(tid + i, NULL, threadfunc, (void*)i
! = EOK)

perror( "thread create error"), exit(EXIT_FAILURE);

}

for (int i=0; i < T; i++)

pthread_join(tid[i], NULL);

for (int i = 0; i < T; i++) sem_destroy(sem + i);

delete [] sem;

for (int i = 0; i < T; i++)

cout << tid[i] << "\t: cycles - " << t[i] << ";\ton semaphore - " <<

t[i] / T / N << endl;

delete [] tid;

delete [] t;

if (debug) {

str[ind] = "\0"; cout << str << endl;

delete [] str;

}

exit(EXIT_SUCCESS);

}

Логически приложение изменилось следующим образом:

• Теперь у нас может быть не 2 идентичных (симметричных) потока, а произвольное их количество (ключ

– t
при запуске приложения).

Потоки синхронизируются не на одном семафоре — введен массив семафоров по числу потоков: каждый поток блокируется на «своем» семафоре, но разблокирует его (после очередного выполнения своего фрагмента) семафор заблокированного «соседа».

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

• Из кода исключены какие бы то ни было средства принудительной передачи управления (

sched_yield
) — все управление логикой ветвления осуществляется только состояниями семафоров.

Посмотрим, что у нас получилось. Запускаем приложение с диагностическим выводом идентификаторов потоков (ключ

– v
; он у нас был в тестах и ранее, только мы о нем не упоминали):

# nice -n-19 sy21 -n20 -t12 -v

2 : cycles - 664874; on semaphore - 2770

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

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Смертник из рода Валевских. Книга 1

Маханенко Василий Михайлович
1. Смертник из рода Валевских
Фантастика:
фэнтези
рпг
аниме
5.40
рейтинг книги
Смертник из рода Валевских. Книга 1

Начальник милиции

Дамиров Рафаэль
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции

Счастливый торт Шарлотты

Гринерс Эва
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Счастливый торт Шарлотты

Я снова не князь! Книга XVII

Дрейк Сириус
17. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я снова не князь! Книга XVII

Вечный Данж VI

Матисов Павел
6. Вечный Данж
Фантастика:
фэнтези
7.40
рейтинг книги
Вечный Данж VI

Последний попаданец 3

Зубов Константин
3. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 3

Не грози Дубровскому!

Панарин Антон
1. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому!

Возвышение Меркурия. Книга 12

Кронос Александр
12. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 12

Найди меня Шерхан

Тоцка Тала
3. Ямпольские-Демидовы
Любовные романы:
современные любовные романы
короткие любовные романы
7.70
рейтинг книги
Найди меня Шерхан

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Комбинация

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

Мой любимый (не) медведь

Юнина Наталья
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Мой любимый (не) медведь