Первая проблема, которую я вижу, заключается в том, что вы используете блокировки слишком часто .
Потоки гораздо менее эффективны, чем последовательное программирование, если все, что ваша программа делает, это берет блокировки.Замки стоят времени, чтобы взять и отпустить.Это время отнимается у той работы, которую должна выполнять ваша программа.
Вторая проблема, которую я вижу, заключается в том, что ваш for
цикл в thrfunction
ничего не делает.Я считаю от 0 до числа?Это все, что он делает?
Третья проблема, которую я вижу, это то, что вы звоните free(pom)
и вы вызываете pthread_mutex_destroy
после создания всех потоков. ПЛОХО! Темы все еще используют его!У вас нет гарантии, что потоки даже начали работать в этот момент.Ваша операционная система может занять несколько секунд или даже минут (если она была нехватка ОЗУ и подкачки на диск), чтобы запустить все те потоки, которые вы создали.каждая «критическая секция», части между замками, на карточках, или использовать что-либо подвижное, чтобы представить эти части.Сделайте столбец из этих карт или кусочки для каждой нити.Эти фрагменты могут перемещаться в любом месте вверх или вниз по временной шкале, если блокировка, соединение, семафоры или что-либо еще не мешают этому.Если вы хотите получить действительно техническую информацию, оптимизация компилятора и выполнение процессора вне очереди могут даже изменить порядок выполнения частей в определенных пределах.
Некоторые программы (не ваша) могут выглядеть следующим образом (и смотреть накак поток замедляется до единой скорости при блокировке в шаге 7):
0 <- parent process spawns threads
1 <- parent process calls join to wait for thread in first column.
2 2 2
3 3
4 3 4
5 5 2
6 6 3
4
5
6
7 4 7 7 <-- step 7 waits for lock
5 8
6 9
7 10
11 <- step 11 releases lock
8
9
10
11
8
9
10
11
8
9
10
11
12 12 12 12
13 13 13 13
14 14 14 14 <- step 14 each thread returns.
15 <- parent process wait on thread 1 succeeds.
16 <- wait for thread 2
17 <- wait for thread 3
18 <- wait for thread 4
19 <- parent now cleans up thread data, lock data.
20 <- parent exits.