Тема Posix основной вопрос C ++ - PullRequest
4 голосов
/ 15 марта 2011

Эй, ребята, у меня есть вопрос о каком-то коде, который я тестирую, чтобы начать понимать потоки posix.

У меня есть такой базовый код:

#include <iostream>
#include <string>
#include <sstream>
#include <pthread.h>
using namespace std;
void *printInfo(void *thid){
    long tid;
    tid =(long)thid;
    printf("Hello from thread %ld.\n",tid);
    pthread_exit(NULL);
}    
int main (int argc, char const *argv[])
{
    int num =8;
    pthread_t threadlist[num];
    int rc;
    long t;
    for(t=0;t<num;t++){
        printf("Starting thread %ld\n",t);
        rc = pthread_create(&threadlist[t],NULL,printInfo,(void *)t);
        if(rc)
        {
            printf("Error creating thread");
            exit(-1);

        }
    }
        pthread_exit(NULL);
    return 0;
}

Очень простой код, запускать потокии выведите из них все эти чудеса, за исключением того, что я не понимаю последний pthread_exit (NULL) перед возвращением 0;в конце основного метода.

Кажется, что основной поток не должен быть pthread, и не должен этого делать!Если я этого не сделаю, код не будет работать (то есть код компилируется и выполняется, но я получаю только печатные сообщения "start thread", а не сообщения "hello from ..".

В общем, я хочу знать, зачем это нужно.

Кроме того, код компилируется и выполняется правильно, если я закомментирую include

Ответы [ 3 ]

4 голосов
/ 15 марта 2011

Если вы не используете pthread_exit в основной функции, то все созданные потоки завершаются как основные, то есть в вашем случае до того, как они что-либо напечатали.

Вызов pthread_exit в основной функции заставляет основное ожиданиепока все потоки не будут завершены.

Со страницы руководства pthread_exit:

Процесс завершится со статусом выхода 0 после завершения последнего потока.Поведение такое, как если бы реализация вызывала exit () с нулевым аргументом во время завершения потока.

Это относится к вызову pthread_exit () из потока основных процессов.

2 голосов
/ 15 марта 2011

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

1 голос
/ 15 марта 2011

Вам необходимо присоединиться к вашим темам.Что происходит без pthread_exit, так это то, что вы запустили потоки, а затем основной выход, прежде чем он фактически запустил какой-либо из потоков.Когда основной выход завершается, программа перестает работать (как и потоки).

Обычно вы используете pthread_join, который ждет, пока указанный поток завершит выполнение.

Кажется, что pthread_exitзаставляет main ждать всех потоков, которые я не знал.Однако я бы посмотрел на это, поскольку этого нет в документации (насколько я читал в любом случае) и, возможно, это не то, на что вы хотите положиться.

Редактировать: также в вашем случае вы неТ надо вообще использовать pthread_exit.Поток автоматически завершится, когда выполненная функция (printInfo в вашем случае) вернется.pthread_exit позволяет завершить поток до того, как выполненная функция вернется, например, если выполненная функция вызывает другую функцию, которая вызывает pthread_exit.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...