Использование моего приложения растет с использованием pthread - PullRequest
1 голос
/ 23 июня 2010

Я использую язык C и Linux в качестве моей платформы программирования.

В моем приложении пользовательского пространства.Я использовал pthread для создания потока.

int main()
{
   pthread_t thread1, thread2;
   pthread_create( &thread1, NULL, fthread1, NULL );
   pthread_create( &thread2, NULL, fthread2, NULL );

   return 0;
}

void *fthread1( void *ptr )
{
   /* do something here */
   pthread_exit( NULL );
}

void *fthread2( void *ptr )
{
   /* do something here */  
   pthread_exit( NULL );
}

Моя проблема в том, что когда я повторяю цикл pthread_create для повторного создания двух потоков, использование памяти моего приложения увеличивается.

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
}

Я определяю использование памяти с помощью инструмента командной строки Linux ps в столбце VSZ.

Кажется, я пропустил некоторую часть, используя pthreads API.Как я могу заставить мое приложение не использовать слишком много памяти.

Ответы [ 3 ]

5 голосов
/ 23 июня 2010

Вы потенциально создаете потоки, когда поток еще работает / еще не запущен.Это неопределенное поведение.(Читайте: очень плохо)

Если вы измените свою программу так:

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
   pthread_join(&thread1, NULL);
   pthread_join(&thread2, NULL);
}

, вы дождитесь завершения потока, прежде чем начинать новый поток.

Примечаниечто каждый поток имеет свой собственный стек вызовов и управляющие структуры и будет использовать память.Лучше всего ограничить количество потоков в приложении, а не создавать и уничтожать потоки быстрым способом.

4 голосов
/ 23 июня 2010

Перед циклом создания новых потоков убедитесь, что существующие завершены:

while( 1 )
{
   pthread_create( &thread1, NULL, fthread1, NULL);
   pthread_create( &thread2, NULL, fthread2, NULL);
   pthread_join(&thread1);
   pthread_join(&thread2);
}

Вы создаете потоки быстрее, чем процессор может их очистить.

0 голосов
/ 17 сентября 2011

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

...