Как мне закрыть тему безопасно? - PullRequest
6 голосов
/ 15 июня 2011
     pthread_create(&thread, NULL, AcceptLoop, (void *)this);

Я объявил вот так, и внутри функции AcceptLoop у меня бесконечный цикл while.Я хотел бы закрыть эту тему, когда сервер закрыт.Я прочитал pthread_cancel и pthread_join, но я не уверен, какой из них лучше и безопаснее.Я хотел бы услышать некоторые подробные инструкции или учебные пособия.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 июня 2011

Вам не нужно ничего делать, просто возвращение из функции потока завершит поток чисто.Вы также можете позвонить pthread_exit(), но я бы предпочел вернуться.pthread_cancel() страшно и сложно / трудно понять правильно.Держитесь подальше, если это возможно.pthread_join() в основном требуется, если вы хотите знать, когда закончится поток и заинтересованы в значении return.

Упс, я ошибаюсь.Это было какое-то времяДля того, что я сказал, чтобы быть правдой, вы должны отсоединиться от своей темы.В противном случае вам нужно вызвать pthread_join:

Для каждого потока, создаваемого приложением, следует вызывать pthread_join (3) или pthread_detach (), чтобы можно было освободить системные ресурсы для потока.(Но обратите внимание, что ресурсы всех потоков освобождаются после завершения процесса.)

http://www.kernel.org/doc/man-pages/online/pages/man3/pthread_detach.3.html

1 голос
/ 15 июня 2011

Я полагаю, что вы хотели бы выйти из рабочего потока с помощью сигнализации из основного потока.

Внутри AcceptLoop вместо того, чтобы бесконечно зацикливаться, вы зацикливаете условие, вы можете установить условие через основной поток. Вам придется использовать некоторую синхронизацию для этой переменной. Как только переменная будет установлена ​​из основного потока, рабочий поток AcceptLoop прервется, и вы сможете вызвать pthread_exit.

если вы хотите, чтобы ваш основной поток ожидал выхода дочернего потока, вы можете использовать pthread_join для этого.

В общем случае дочерний поток может завершиться в трех условиях:

  1. звонит pthread_exit.
  2. звонит pthread_cancel.
  3. Функция потока возвращает.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...