2015-10-26 3 views
0

у меня есть этот следующий код:производительность потоков в C++

for (int i = 0 ; i < 100 ; i++) 
    for (int j = 0 ; j < 80 ; j ++) 
    { 
    ... 
    } 

я расщепляется его 8 потоков.

pthread_t thread1, thread2,thread3,thread4,thread5,thread6,thread7,thread8; 
int rc1,rc2,rc3,rc4,rc5,rc6,rc7,rc8; 



struct threads 
{ 
... 
} 

void *PrintHello(void *args) 
{ 
    for (int j = 0 ; j < 10 ; j ++) 
    { 
    } 

} 

    for (int i = 0 i < 100 ; i ++) 
    { 
    rc1 = pthread_create(&thread1, NULL,PrintHello,threads);, 
    pthread_join(thread1,NULL); 
    rc2 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread2,NULL); 
    rc3 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread3,NULL); 
    rc4 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread4,NULL); 
    rc5 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread5,NULL); 
    rc6 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread6,NULL); 
    rc7 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread7,NULL); 
    rc8 = pthread_create(&thread1, NULL,PrintHello,threads); 
    pthread_join(thread8,NULL); 

    } 

я думаю, второй один должен быть быстрее, чем сначала один .Но, второй один ведет себя как что есть только один thread.In Другими словами, код, который не расщепляется и код, который расщепляется пробег в то же время. Почему у них одинаковое время работы, а во втором - 8 потоков, у первого есть один поток?

Заранее благодарим.

+0

Что вы хотите сказать? Кроме того, какая платформа? –

+0

Извините, не обновлено вопрос – ort23

+0

Ваша функция «PrintHello» настолько тривиальна, что использование ее для синхронизации потоков не даст вам каких-либо значимых результатов. Накладные расходы по настройке и разрыву нитей намного более значительны для сравнения. – Chad

ответ

4

pthread_join(thread1,NULL); прекращает выполнение основной резьбы до thread1 отделка. Вам нужно переместить все pthread_join s после того, как вы построите все потоки, чтобы все они могли работать одновременно.

Вы также используете thread1 на каждые pthread_create(&thread1, NULL,PrintHello,threads);. Вы должны использовать другие темы, а также

for (int i = 0 i < 100; i++) 
{ 
    rc1 = pthread_create(&thread1, NULL, PrintHello, threads); 
    rc2 = pthread_create(&thread2, NULL, PrintHello, threads); 
    rc3 = pthread_create(&thread3, NULL, PrintHello, threads); 
    rc4 = pthread_create(&thread4, NULL, PrintHello, threads); 
    rc5 = pthread_create(&thread5, NULL, PrintHello, threads); 
    rc6 = pthread_create(&thread6, NULL, PrintHello, threads); 
    rc7 = pthread_create(&thread7, NULL, PrintHello, threads); 
    rc8 = pthread_create(&thread8, NULL, PrintHello, threads); 
    pthread_join(thread1, NULL); 
    pthread_join(thread2, NULL); 
    pthread_join(thread3, NULL); 
    pthread_join(thread4, NULL); 
    pthread_join(thread5, NULL); 
    pthread_join(thread6, NULL); 
    pthread_join(thread7, NULL); 
    pthread_join(thread8, NULL); 

} 
2

Кроме того, что сказал @NathanOliver, имейте в виду, что нерест нить идет на значительные затраты, поэтому все, что работа, которую вы собираетесь нити сделать, это должно быть более дорогостоящий, чем штраф, который вы получаете за фактическое появление всех этих потоков. Поэтому, если ваш метод PrintHello действительно делает именно это, вы, вероятно, по-прежнему увидите ухудшение производительности по сравнению с однопоточной версией. Обычный способ, с помощью которого эти затраты компенсируются, заключается в том, чтобы порождать конечное количество потоков в самом начале и делить работу, поскольку она становится доступной среди них.

Кроме того, в прошлом, но не в последнюю очередь, если ваш метод PrintHello фактически делает только то, что, то есть printf("Hello\n") или подобное, вы, скорее всего, не видят повышение производительности независимо от того, что, как и printf(), скорее всего, взять общий замок, который будет видеть Огромное противоречие со всеми вашими нитями, которые много раз пытались его принять.

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

0

Дополнительно к @NathanOliver и @JustSid не очень удобно определять 8 потоков отдельно и писать в 8 раз один и тот же код, если все они выполняют одну и ту же работу. Гораздо лучше использовать что-то вроде

pthread_t threadlist[8]; 
int results[8]; 

Для инициализации это простой для цикла будет делать.

for(int i = 0; i < 8; i++) 
    results[i] = pthread_create(&threadlist[i], NULL, PrintHello, threads); 

и начать темы с

for(int i = 0; i < 8; i++) 
    pthread_join(threadlist[i], NULL); 

Это уменьшает код много. Возможно, есть действительно слегка меняются во время выполнения, но цикл for с int - это всего лишь несколько команд ассемблера. Я не знаю, это даже измеримо.

+0

Не поддается измерению. Поскольку эти циклы имеют условие завершения константы компиляции и действительно короткие, любой компилятор, который стоит использовать, разворачивает циклы. – user4581301

+0

@ user4581301, я бы даже сказал, что ЛУЧШЕ иметь петли, поскольку они могут быть векторизованными при разворачивании :) – SergeyA

+0

Более чистый код будет более моим. Если вместо 8 мы имели 'NUM_THREADS' некоторого типа' const', все это легко масштабируется для большего количества потоков с изменением одного значения. Хотя идея паралеллизации создания потоков - это то, что я считаю забавным. – user4581301

Смежные вопросы