2014-02-07 4 views
0

Во-первых, я новичок в pthreads, поэтому, если я полностью неправильно понял, просто дайте мне знать.Confused about pthreads

Я искал правильный способ возврата значений и наткнулся на эту ссылку How to return a value from thread in C и https://linuxprograms.wordpress.com/category/pipes/.

Таким образом, я могу обмениваться местоположениями, управляемыми исходной нитью или информацией о трубах, но последнее значение не может быть помещено в какой-то стек? Почему я не могу return так же, как это делает программа при вызове shell (например, bash)?

(Из того, что я понимаю, можно было бы иметь регулярное возвращаемое значение, если оно было C++, но (согласно чему-то, что я читаю, я думаю, что здесь возможно https://computing.llnl.gov/tutorials/pthreads/) POSIX не полностью определен для C++, просто C.)

+2

Предложение: 'std :: thread' – Aleph

+0

Звуки, которые вы ищете [' pipe() '] (http://pubs.opengroup.org/onlinepubs/009695399/functions/pipe.html), а не потоки. .. Вы после получения «возвращаемого значения» после присоединения? –

+0

AnotherTest, не std :: thread a pthread для C++ 11?πάντα ῥεῖ, нет, он должен использовать pthreads. – ConfusedStack

ответ

2

Посмотрите на pthread_exit и pthread_join.

Когда вы сделали с вашей темой вы можете вызвать pthread_exit(void* retval)

В pthread_exit() функция завершает вызывающий поток и возвращает значения через RETVAL, что (если нити присоединяемая) доступно другой поток в том же процессе, который вызывает pthread_join (3).

Этот вызов pthread_exit будет остановить поток и, как говорится, сохранить возвращаемое значение где pthread_join может добраться до него и поместить его в свой второй аргумент: int pthread_join(pthread_t thread, void **retval);

Когда вы звоните pthread_join(tid, &returnVal); где TID является a pthread_t, returnVal теперь будет содержать указатель на возвращаемое значение pthread_exit

Это позволяет вам передавать данные из потоков при их выходе.

+4

'& retval' также будет хранить значение, казалось бы, все-часто забытого' void * ', возвращенного из самого процесса потока, если' pthread_exit' is * not * вызывается в потоке, выбирая скорее просто позволить завершению потока-proc и «возвращать что-то». Я предпочитаю этот подход, особенно когда у меня есть объекты C++ с локальной областью, которые нуждаются в уничтожении. – WhozCraig

1

Каждый поток имеет свой собственный стек и локальную среду с родительским процессом. Ваш основной процесс создает один поток (основной поток), и ваш код работает под ним. Любые другие темы, которые вы создаете, получают одно и то же обращение: каждый получает стек, контекст потока, локальное хранилище потоков (где это применимо) и нет общего стека для возврата значения.

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

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

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