Вход/Регистрация
QNX/UNIX: Анатомия параллелизма
вернуться

Цилюрик Олег Иванович

Шрифт:

<< ", on sched - " << (t / N) / 2 << endl;

return NULL;

}

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

int opt, val;

while ((opt = getopt(argc, argv, "n:")) != -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;

default:

exit(EXIT_FAILURE);

}

}

const int T = 2;

pthread_t tid[T];

// создать взаимодействующие потоки

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

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

cout << "thread create error", exit(EXIT_FAILURE);

// и дожидаться их завершения ...

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

pthread_join(tid[i], NULL);

exit(EXIT_SUCCESS);

}

Результаты выполнения программы:

# nice -n-19 p5t -n100

2 : cycles - 79490; on sched - 397

3 : cycles - 78350; on sched — 391

# nice -n-19 p5t -n1000

2 : cycles - 753269; on sched - 376

3 : cycles - 752069; on sched - 376

# nice -n-19 p5t -n10000

2 : cycles - 7494255; on sched - 374

3 : cycles - 7493225; on sched - 374

# nice -n-19 p5t -n100000

2 : cycles - 74897795; on sched - 374

3 : cycles - 74895800; on sched — 374

# nice -n-19 p5t -n1000000

2 : cycles - 748850811, on sched - 374

3 : cycles - 748850432; on sched - 374

Как и в случае с процессами, результаты отличаются очень высокой устойчивостью при изменении «объема вычислений» на 4 порядка, однако по своим величинам значения для потоков почти в 2 раза меньше, чем для процессов (стр. 45).

Завершение потока

Как и в случае обсуждавшегося ранее завершения процесса, для потоков мы будем отчетливо различать случаи:

• «естественного» завершения выполнения потока из кода самого потока;

• завершения потока извне, из кода другого потока или по сигналу. Для этого действия, в отличие от «естественного» завершения, будем использовать другой термин — отмена.

Завершение потока происходит при достижении функцией потока своего естественного конца и выполнения оператора

return
(явно или неявно) или выполнения потоком вызова:

void pthread_exit(void* value_ptr)

где

value_ptr
— указатель на результат выполнения потока.

При выполнении

pthread_exit
поток завершается. Если этот поток принадлежит к категории ожидаемых, он может возвратить результат своей работы другому потоку, ожидающему его завершения на вызове
pthread_join
(только один поток может получить результат завершения). Если же этот поток отсоединенный, то по его завершении все системные ресурсы, задействованные потоком, освобождаются немедленно.

  • Читать дальше
  • 1
  • ...
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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