2016-12-04 6 views
0

Так что я не сразу отправляю код здесь, потому что я студент и знаю, что мой код в настоящее время довольно уродлив и в этом случае довольно большой.При использовании pthreads в C++ на Ubuntu. Где начинается и заканчивается основная область потока?

Вопрос 1: Это говорит, что я пытаюсь устранить свою ситуацию больше, чем получить чужое решение моей проблемы. Тем не менее, для начала я просто ищу простой ответ на вопрос о времени жизни основной области потока, когда функция pthread_create вызывается в функции-члене класса. Эта функция-член действует как основной поток, перемещается ли основной поток в другие функции-члены, вызванные внутри этой функции-члена? Или основной поток даже выходит из этой функции, скажем, если эта функция вызывается в цикле от другой функции, будет ли основной поток существовать в этой внешней функции, напоминание о том, что функция pthread_create вызывается функцией в цикле в внешняя функция?

Вопрос 2: Поскольку мне нужно было использовать оболочку для функции вызова для работы с членом класса, я бы использовал pthread_exit в моей оболочке или в моей завернутой функции? И любое понимание структуры вещей, когда это делается таким образом, которое может отличаться от занятий без занятий, было бы весьма признательно.

Вопрос 3: Настроить. Я пытаюсь сохранить идентификаторы потока в виде массива беззнаковых длинных int в моем классе, но всякий раз, когда я пытаюсь использовать один из них в функции pthread_join, он прерывается. Нужно ли быть массивом pthread_t '? В чем разница между pthread_t и unsigned long?

Просто напоминание Я студент не профессионал, пожалуйста, постарайтесь принять это во внимание в ответах, спасибо заранее.

+0

Я более чем готов опубликовать код, если это произойдет. – Gaetano

ответ

0

1 - Создание Pthread полностью асинхронное. Основной поток создает вызов для создания, который запускает новый поток на основе заданных параметров и немедленно возвращает для выполнения следующей строки кода. Этот основной поток продолжается, поскольку в противном случае он будет не обращать внимания на вновь созданный поток. Между тем, новый поток выполняется параллельно. Кажется, вы немного смущены. Проще говоря, этот новый поток будет продолжать существовать до тех пор, пока он не выйдет, независимо от того, какая область (например, внутри цикла) была создана внутри. Точно так же основная область потока не имеет никакого значения. Он только начинает новую тему и продолжается, как будто ничего не произошло. В общем, они совершенно не знают о существовании друг друга, они просто разделяют ваше пространство памяти процессов.

3 - Тип pthread_t, поэтому храните его как таковой. Всегда избегайте хранить один тип как что-то еще, если у вас нет веских оснований для этого. Это может ответить на ваш вопрос о разнице (http://www.ibm.com/support/knowledgecenter/ssw_i5_54/apis/concep17.htm)

+0

Но мой «главный», как в моем «int main() {...}», не там, где происходит вызов «pthread_create (...)». Это происходит в функции-члене класса. Таким образом, основной поток по-прежнему является потоком, который создается в «main» или является функцией-членом, где pthread_create() называется рассматриваемой «основной» нитью этого разделенного потока. P.S Эта ссылка полностью ответила на мой третий вопрос, спасибо. – Gaetano

+0

@Gaetano Существует только одна «основная» нить. Этот поток будет выполнять «int main», а также функцию-член. потоки не связаны с функциями, которые они выполняют, т. е. когда поток выполняет «int main» и встречает вызов функции memberFunction, тот же самый поток перескакивает на memberFunction и начинает выполняться там. Когда это делается при выполнении функции memberFunction, он возвращается к «int main» и продолжает выполнение. – Erix

+0

Спасибо. Так я думал, что это сработало, но ошибки, которые я получал, заставляли меня задаваться вопросом о других мудрых. Я все еще пытаюсь выяснить, как хранить идентификатор потока где-нибудь, чтобы я мог присоединиться к другой функции, а затем к той, где она создана.Это мой первый раз, работая с потоками, и мне было очень мало информации, чтобы продолжить, поэтому я ценю вклад. – Gaetano

 Смежные вопросы

  • Нет связанных вопросов^_^