Почему pthread_create () возвращает 12? - PullRequest
0 голосов
/ 31 декабря 2011

По какой-то причине pthread_create не позволяет мне передать struct в качестве аргумента.Проблема не связана с системой, хотя у меня не было возможности протестировать ее на чьей-либо коробке.Это просто не позволит мне передать struct по какой-то причине;возвращается ошибка № 12.

Проблема не с памятью.Я знаю, что 12 - это ENOMEM, и «это должно быть так», но это не так… он просто не примет мою структуру в качестве указателя.

struct mystruct info;    
info.website = website;
info.file = file;
info.type = type;
info.timez = timez;
for(threadid = 0; threadid < thread_c; threadid++)
   {
    // printf("Creating #%ld..\n", threadid);
    retcode = pthread_create(&threads[threadid], NULL, getstuff, (void *) &info);
   //void * getstuff(void *threadid);

Когда я запускал этот код в GDB, для некоторыхпричина, он не вернул код 12 .. но когда я запускаю его из командной строки, он возвращает 12.

Есть идеи?

Ответы [ 3 ]

6 голосов
/ 31 декабря 2011

Код ошибки 12 в Linux:

#define ENOMEM          12      /* Out of memory */

Вероятно, вам не хватает памяти.Убедитесь, что вы не выделяете слишком много потоков, и убедитесь, что pthread_join потоков, когда они сделаны (или используйте pthread_detach).Убедитесь, что вы не исчерпываете свою память и другими способами.

2 голосов
/ 31 декабря 2011

Передача стекового объекта в качестве параметра в pthread_create - довольно плохая идея, я бы выделил его в куче. Ошибка 12 - ENOMEM.

1 голос
/ 31 декабря 2011

Попробуйте добавить правильную обработку ошибок.

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
static void fail(const char *what, int code)
{
    fprintf(stderr, "%s: %s\n", what, strerror(code));
    abort();
}

...
if (retcode)
    fail("pthread_create", retcode);

В моей системе 12 равно ENOMEM (недостаточно памяти).

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