Во-первых, я новичок в pthreads, поэтому, если я полностью неправильно понял, просто сообщите мне.
Я искал правильный метод возврата значений и наткнулся на эту ссылку. Как вернуть значение из потока в C и https://linuxprograms.wordpress.com/category/pipes/.
Таким образом, я могу делиться местоположениями, контролируемыми исходной нитью или информацией о канале, но последнее значение не может быть помещено в некоторый стек? Почему я не могу return
же, как это делает программа при вызове shell
(например, bash)?
(Из того, что я понимаю, можно было бы иметь регулярное возвращаемое значение, если оно было C++, но (в соответствии с тем, что я читал, я думаю, что, возможно, https://computing.llnl.gov/tutorials/pthreads/) POSIX не полностью определена для C++, просто C.)
Взгляните на 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 - pthread_t, returnVal теперь будет содержать указатель на возвращаемое значение pthread_exit
Это позволяет вам передавать данные из потоков при их выходе.
&retval
аналогичным образом будет содержать значение, по-видимому, часто пропускаемого void*
возвращаемого из самого процесса потока, если pthread_exit
не вызывается в потоке, предпочитая просто позволить потоку завершить процесс и return something
. Я предпочитаю такой подход, особенно когда у меня есть объекты C ++ локальной области, которые требуют уничтожения.
Каждый поток имеет свой собственный стек и локальную среду с родительским процессом. Ваш основной процесс создает один поток (основной поток), и ваш код работает под ним. Любые другие темы, которые вы создаете, получают одно и то же обращение: каждый получает стек, контекст потока, локальное хранилище потоков (где это применимо) и нет общего стека для возврата значения.
Когда вы присоединяетесь к потоку, который вы начали, что происходит, вы на самом деле ожидаете его завершения. Это разблокирует ожидание, но не будет возвращать какое-либо значение пользователя, поскольку, как правило, поток, его стек и вся его среда внутри процесса уничтожаются. Хотя потоки выполняются, они могут взаимодействовать друг с другом в описанных вами способах, а также могут читать и записывать в общие ячейки памяти, пока вы используете механизм синхронизации для сериализации этих обращений.
Если у вас должно быть возвращаемое значение из вашего потока, тогда вы можете его инкапсулировать в класс, передать его экземпляр класса при запуске, а затем перед тем, как поток выйдет, он может оставить "возвращаемое значение" в члене этого класс, чтобы вы могли проверить его после того, как возвращается метод класса "запустить" или "начать" (тот, который фактически запускает поток).
Надеюсь это поможет.
std::thread
pipe()
а не потоки ... Получаете ли вы "возвращаемое значение" после объединения ??