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

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

Шрифт:

uint64_t t = 0, t1;

while (i++ != N) {

t1 = ClockCycles;

pthread_mutex_lock(&mutex);

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

pthread_mutex_unlock(&mutex);

t += ClockCycles - t1;

sched_yield;

}

cout << pthread_self << "\t: cycles - "

<< t << ", on mutex - " << t / N << endl;

return NULL;

}

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

int opt, val;

while ((opt = getopt(argc, argv, "n,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 'v':

debug = true;

break;

default:

exit(EXIT_FAILURE);

}

}

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

const int T = 2;

pthread_t tid[T];

if (pthread_barrier_init(&bstart, NULL, T) != EOK)

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

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

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

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

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

pthread_join(tid[i], NULL);

if (debug) {

str[ind] = '\0';

cout << str << endl;

delete [] str;

}

exit(EXIT_SUCCESS);

}

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

# sy20m -n100000

3 : cycles - 14644442, on mutex - 146

2 : cycles - 14614219; on mutex - 146

# sy20m -n1000000

3 : cycles - 146505047; on mutex - 146

2 : cycles - 146388673; on mutex - 146

Модифицируем программу, используя вместо мьютекса неименованный бинарный семафор. Для того чтобы не загромождать текст практически тем же кодом, перечислим только необходимые при этом изменения ( файл sy20s.cc):

1. Вместо мьютекса объявляем неименованный семафор, а статическая инициализация мьютекса заменяется на оператор (в теле главной программы) динамической инициализации семафора с присвоением ему начального значения 1:

static sem_t sem;

...

if (sem_init(&sem, 0, 1) != 0)

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

2. Функция потока принимает вид:

void* threadfunc(void* data) {

...

while (i++ != N) {

t1 = ClockCycles;

sem_wait(&sem);

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

sem_post(&sem);

t += ClockCycles - t1;

sched_yield;

}

...

}

В результате исполнения на этот раз мы получим:

  • Читать дальше
  • 1
  • ...
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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