2010-02-10 2 views
1

Основном это то, что у меня есть:C++ Confused о Threads

Server:: 
Server (int port) { 
    cout << "Initializing server.\n"; 

    (...)  

    pthread_t newthread; 
    pthread_create(&newthread, NULL, &Server::_startListening, NULL); 

    cout << "Exit\n"; 
    pthread_exit(NULL); // <-- Question 
} 

void* Server::_startListening (void* param) { 
cout << "Start listening for clients ...\n"; 
return 0; 
} 

Вопрос: Если я не ставлю pthread_exit (NULL); в коде он будет работать, когда я скомпилирую его на Linux (Ubuntu), но он не будет работать на Mac OSX 10.6.2. Когда я компилирую и запускаю его на Linux, он скажет: «Инициализирующий сервер», «Начать прослушивание клиентов», «Выход» на Mac OSX, он скажет «Инициализация для сервера», «Выход», «Начать прослушивание клиентов».

Проблема, кажется, происходит вокруг pthread_exit, если я размещаю ее над cout < < Выход. Это сообщение никогда не будет отображаться (как это странно).

Я что-то не так?

+0

Что вы ожидаете 'pthread_exit (NULL);' делать? –

+0

Но почему Mac OS игнорирует поток, если pthread_exit или pthread_join не задан? – Mark

ответ

7

Вы, вероятно, собираетесь использовать pthread_join, а не выйти.

3

Проблема, кажется, происходит вокруг pthread_exit, если поместить его над соиЬ < < выход. Это сообщение никогда не будет отображаться (как это странно).

Не странно. Когда вы вызываете pthread_exit, текущий поток прекращает выполнение. Поскольку только в этом потоке вы собираетесь отображать «exit», как только этот поток исчезнет, ​​ничего не остается, чтобы его распечатать.

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

0

Threading (планирование и т. Д.) Зависит от ОС. Похоже, что в Linux ваша ОС переключает контекст в ваш новый поток, прежде чем продолжить в основном потоке, а в Mac OS продолжит выполнение текущего потока перед переключением контекста. Поскольку это зависит от ОС, если вы не выполняете какую-либо синхронизацию, нет надежного способа сообщить, какая строка из двух потоков будет выполняться первой, и даже ваши протестированные «linux будут переключать контексты», результаты ненадежны.

pthread_exit, как упоминалось выше, выходит из текущего текущего потока (то есть: main()), а не других потоков (_startListning). Вы, вероятно, ищете соединение (pthread_join) другого потока, а не выход из текущего.

1

Заказ вашего вывода неопределен. Это то, что означает параллелизм! Остальные два ответа правы: pthread_exit до вашего выхода убивает основной поток, и вы, вероятно, собираетесь присоединиться, прежде чем произойдет основной выход.

0

pthread_exit предполагается вызывать из нити, которую вы хотите остановить. Вызов из потока main() приведет к прекращению основного потока, и ваша программа будет работать до тех пор, пока нити слушателя не выйдут.

Рекомендовать ознакомиться с файлами на pthread_exit и pthread_join.

0

Я думаю, что на ваш вопрос уже был дан ответ, но вы также можете заглянуть в библиотеку потоков Boost, которая даст вам более легкую кросс-платформенность, если вы когда-нибудь заходите в Windows, плюс хороший объектно-ориентированный интерфейс.

Смежные вопросы