Pthreads - высокое использование памяти - PullRequest
8 голосов
/ 30 августа 2011

Я программирую что-то на C, что создает много Pthreads в Linux в системе 256Mb.Обычно у меня свободно + 200 МБ.

Когда я запускаю программу с небольшим количеством потоков, она работает, но как только я создаю около 100 потоков, это дает ошибки, потому что системе не хватает памяти.Я сделал несколько тестов, и каждый поток использует почти 2 МБ.Размер стека потоков установлен в 16 КБ.

Код, который я использую для создания каждого потока:

pthread_attr_t attr;
pthread_attr_init(&attr);
size_t stacksize;
stacksize = (double) 16*1024;
int res = pthread_attr_setstacksize (&attr, stacksize);
int res2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (res != 0 || res2 != 0) {
    logs << "pthread_attr_XX: error "+int2string(res);
    exit(-1);
}
pthread_t id;
pthread_create(&id, &attr, &Class::thread_callback, &some_var);

Это нормально или я что-то упустил?Спасибо.

Ответы [ 6 ]

4 голосов
/ 30 августа 2011

Не уверен, что это поможет, но попробуйте вызвать setrlimit с RLIMIT_STACK, чтобы ограничить размер стека до 16 КБ, прежде чем создавать свой первый поток.

2 голосов
/ 30 августа 2011

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

1 голос
/ 30 августа 2011

Почему stacksize = (double) 16*1024;?Это целое число.

Попробуйте установить его в 32 или 64 килобайта, потому что 16 * 1024 может быть не разрешено;в стеке также может быть TLS (даже если вы не используете TLS; библиотеки используют, включая libc).

Итак, измените строку на

stacksize = 64*1024; 

и проверьте, сколько памятипотребляется.

1 голос
/ 30 августа 2011

Да, довольно часто любая операционная система душит и умирает от такого количества потоков. Это не проблема, которую производители ОС (Linux или другие) уделили много внимания, так как очень немногие системы имеют столько процессоров, так что ваш код вряд ли будет выполняться намного быстрее с 100 потоками, чем с 8 (или сколькими процессорами вы есть).

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

0 голосов
/ 03 апреля 2015

Может быть, в этом причина:

"(Распознавание утечек

Если вы создаете присоединяемый поток, но забываете присоединиться к нему, его ресурсы или личная память всегда остаются в пространстве процессаи никогда не возвращаются. Всегда присоединяйтесь к присоединяемым потокам; не присоединяясь к ним, вы рискуете серьезной утечки памяти.) "

Прочитайте это здесь: http://www.ibm.com/developerworks/library/l-memory-leaks/

0 голосов
/ 30 августа 2011

Если вы хотите снизить накладные расходы, рассмотрите технологии многопоточности в пользовательском пространстве, такие как волокна, аля совместное управление задачами.

http://en.wikipedia.org/wiki/Fiber_(computer_science)

http://www.evanjones.ca/software/threading.html

GNU Переносимые темы:

http://www.gnu.org/software/pth/

Повышение сопрограмм C ++:

http://www.boost.org/doc/libs/1_60_0/libs/coroutine/doc/html/index.html

Волокна только для Windows в качестве FYI:

http://msdn.microsoft.com/en-us/library/ms682661(v=vs.85).aspx

См. Ссылку на Википедию для примеров реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...