Pthreads - из памяти? - PullRequest
       18

Pthreads - из памяти?

2 голосов
/ 07 апреля 2011

Я программирую что-то на C, что создает много Pthreads в Linux.

Когда я запускаю программу с небольшим количеством потоков, она работает, но как только я создаю около 1000 потоков, это дает ошибки. Теперь установлен флаг errno, но я хочу знать, какая из проблем вызвала его. EAGAIN, EINVAL, ELEMULTITHREADFORK или ENOMEM.

Могу ли я узнать, является ли это одной из этих ошибок, и если да, то какой именно?

Ответы [ 3 ]

8 голосов
/ 07 апреля 2011

Я считаю, что вам нужна функция pthread_attr_setstacksize.По умолчанию glibc резервирует 2 МБ, 8 МБ или 10 МБ или память для стека каждого потока.При такой скорости вы быстро исчерпаете виртуальное адресное пространство на 32-разрядной машине и быстро исчерпаете комиссионный сбор даже на 64-разрядных машинах.

pthread_t td;
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 32768);
pthread_create(&td, &attr, start_function, start_art);
pthread_attr_destroy(&attr);

Этот код слишком упрощен;естественно, вы можете захотеть проверить сбой некоторых из этих вызовов.На самом деле, именно об этом и был ваш вопрос.pthread_* почти все функции возвращают код ошибки в качестве значения возврата , а не errno, поэтому errno не может использоваться для проверки результата, и perror не будет работать, если вы не назначитевозвращаемое значение errno.Вместо этого сделайте что-то вроде:

result = pthread_create(&td, &attr, start_function, start_art);
switch (result) {
case EINVAL: /* ... */
case EAGAIN: /* ... */
/* etc. */
}
2 голосов
/ 07 апреля 2011

perror() должен сделать трюк.

Выполните man 3 perror в вашей системе Linux.

1 голос
/ 07 апреля 2011

Только для сырного теста:

int ret;
pthread_t tid;

if ((ret = pthread_create(&tid, NULL, startfunc, NULL)) != 0)
{
    errno = ret;
    perror("pthread_create");
}

R правильно, что размер стека по умолчанию собирается жевать память с таким количеством потоков.

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