C - выделение одного целого числа - PullRequest
1 голос
/ 07 апреля 2011

Я экспериментирую с библиотекой pthread, и у меня есть следующий фрагмент кода:

for (int j = 0; j < NUM_THREADS; j++)
{
     int *threadNum = malloc(sizeof(int));
     *threadNum = j;
     pthread_create(..., (void *)threadNum);
}

Поскольку свободного места нет, этот код имеет утечку памяти.Где я должен разместить бесплатно, чтобы избежать утечек памяти?Если я просто напишу что-то вроде:

int *threadNum = 0;
*threadNum = j;

Это приведет к segfault.И я не могу разместить бесплатно внутри области, потому что я использую pthread_join в следующих нескольких строках.

Ответы [ 5 ]

7 голосов
/ 08 апреля 2011

Поток, который его использует (поскольку он передается в качестве параметра), должен освободить его, когда это будет сделано с ним.

3 голосов
/ 08 апреля 2011

Никогда не делайте этого!Вы потеряете значение threadNum при каждом цикле, это огромная ошибка памяти 1005 *!Вы должны выделить массив с элементами NUM_THREADS перед циклом и освободить, когда он вам больше не нужен!

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

Как насчет этого: создать массив размером NUM_THREADS, и на каждой итерации вы можете назначить j для j-го индекса в массиве.Затем вы можете передавать адрес индекса массива каждому вызову pthread_create, и это также не потребует динамического выделения.

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

Вы должны вызывать free, когда вы больше не используете выделенную память.

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

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

int *threadNums = malloc(sizeof(int) * NUM_THREADS)

for (int j = 0; j < NUM_THREADS; j++) {
  threadNum[j] = j;
  pthread_create(..., (void *)&threadNum[j]);
} 

//something to ensure the threads are done using the memory

free(threadNums);

(не проверено на синтаксические ошибки, но, надеюсь, вы поняли идею)

Обратите особое внимание на комментарий.Если ваши потоки не были заняты памятью до того, как вы вызовете free, у вас есть состояние гонки, которое вызывает неопределенное поведение.Один из способов обеспечить это - объединить все потоки.

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

0 голосов
/ 08 апреля 2011

Вы должны просто написать свой код следующим образом:

for (int j = 0; j < NUM_THREADS; j++)
{
     pthread_create(..., (void *)j);
}

Тогда выделение не требуется.Приведите аргумент функции запуска потока обратно к (int), чтобы использовать его.Поскольку вы используете pthread_create, вы нацелены на систему POSIX, а это означает, что вам не нужно иметь дело со всеми бессмысленными простыми C-символами, из-за которых этот тип приведения может не работать.

...