Многопоточность (pthreads) - PullRequest
0 голосов
/ 11 марта 2012

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

В моей программе у меня есть вспомогательная функция, которая называется 'func_call'. Если я использую это в моем коде:

func_call((void*) &my_pixels);

Программа работает нормально.

Однако, если я попытаюсь создать поток и затем запустить функцию для него, программа столкнется с ошибкой сегментации.

pthread_t thread;
pthread_create (&thread, NULL, (void*)&func_call, (void*) &my_pixels);

Я включил pthread.h в свою программу. Есть идеи, что может быть не так?

Ответы [ 3 ]

0 голосов
/ 11 марта 2012

Вы не обрабатываете данные потокобезопасным способом:

  • поток копирует данные из аргумента потока, который является указателем на переменную my_pixels основного потока; основной поток может завершиться, что делает my_pixles недействительным.
  • поток использует scene, основной поток вызывает для него free_scene(), что, по-моему, делает его недействительным
  • поток вызывает printf(), основной поток закрывается stdout (что-то необычное)
  • поток обновляет массив picture, основной поток обращается к picture для вывода данных из него

Похоже, вам следует подождать, пока поток завершит свою работу после его создания - для этого позвоните pthread_join().

Для одного потока это может показаться бессмысленным (вы только что превратили многопоточную программу в однопоточную). Но на основе закомментированного кода создается впечатление, что вы планируете запустить несколько потоков, которые работают с фрагментами данных. Итак, когда вы снова попытаетесь это сделать, убедитесь, что вы присоединяетесь к всем потокам, которые вы запускаете. Пока потоки не изменяют одни и те же данные, это будет работать. Обратите внимание, что вам нужно будет использовать отдельные my_pixels экземпляры для каждого потока (составьте их массив, как вы это сделали с pthreads), иначе некоторые потоки, вероятно, получат параметры, предназначенные для другого потока.

0 голосов
/ 20 марта 2012

Является ли func_call функцией или указателем функции?Если это указатель на функцию, то есть ваша проблема: вы взяли адрес указателя на функцию и затем произвели его.

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

Ваш компилятор должен диагностировать эту программу, поскольку вы передаете выражение (void *) параметру указателя функции.

Определите свой потокФункция совместима с pthread_create, а затем просто вызывается без приведения.

0 голосов
/ 11 марта 2012

Не зная, что делает func_call, трудно дать вам ответ. Тем не менее, здесь мало возможностей

  1. Использует ли func_call какое-то глобальное состояние - проверьте, правильно ли оно инициализировано из потока. Порядок выполнения потоков не всегда одинаков для каждого выполнения
  2. Не зная вашей операционной системы (AIX / Linux / Solaris и т. Д.), Трудно ответить на этот вопрос, но, пожалуйста, проверьте параметры компиляции
  3. Пожалуйста, укажите signal в ловушке и по крайней мере несколько строк трассировки стека - для всех потоков. Одна вещь, которую вы можете проверить самостоятельно - это распечатать дорожку стека потоков (используя threads / thread или pthread и thread current <x> на основе отладчика) и, если есть общие данные, к которым осуществляется доступ , Скорее всего, произошел сбой, когда два потока пытались считывать (не зафиксированное) изменение другого *

Надеюсь, это поможет.

Edit: После проверки вашего кода, я думаю, что проблема в глобальном массиве picture. Вы, кажется, изменяете это в функции потока без каких-либо охранников. Вы зацикливаетесь, используя px и py, и все потоки будут иметь одинаковые px и py и будут пытаться одновременно записывать в массив picture. Пожалуйста, попробуйте изменить свой код, чтобы не допустить множественных потоков к изменению данных друг друга.

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