Смущенный о pthreads

0

Во-первых, я новичок в pthreads, поэтому, если я полностью неправильно понял, просто сообщите мне.

Я искал правильный метод возврата значений и наткнулся на эту ссылку. Как вернуть значение из потока в C и https://linuxprograms.wordpress.com/category/pipes/.

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

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

  • 2
    Предложение: std::thread
  • 0
    Похоже, вы ищете pipe() а не потоки ... Получаете ли вы "возвращаемое значение" после объединения ??
Показать ещё 2 комментария
Теги:
pthreads
posix

2 ответа

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 - pthread_t, returnVal теперь будет содержать указатель на возвращаемое значение pthread_exit

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

  • 4
    &retval аналогичным образом будет содержать значение, по-видимому, часто пропускаемого void* возвращаемого из самого процесса потока, если pthread_exit не вызывается в потоке, предпочитая просто позволить потоку завершить процесс и return something . Я предпочитаю такой подход, особенно когда у меня есть объекты C ++ локальной области, которые требуют уничтожения.
1

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню