Потоки в C, C ++, C ++ 0x, pthread и boost - PullRequest
8 голосов
/ 19 августа 2009

Вопрос о потоках в C / C ++ ...

C ++ 0x синтаксис

#include <thread>

void dummy() {}

int main(int, char*[]) {
   std::thread x(dummy);
   std::thread y(dummy);
   ...
   return 0;
}

Сколько там потоков? Два (х и у) или три (х, у и главное)? Могу ли я позвонить this_thread::yield() в основном? И что я получу от звонка this_thread::get_id() в основном?

Синтаксис pthread

#include <pthread.h>

void dummy() {}

int main(int, char*[]) {
   pthread_t x, y;
   pthread_create(&x, NULL, &dummy, NULL);
   pthread_create(&y, NULL, &dummy, NULL);
   ...
   return 0;
}

Сколько там потоков? Два (х и у) или три (х, у и главное)? Могу ли я позвонить pthread_yield() в основном? И что я получу от звонка pthread_self() в основном?

синтаксис повышения

#include <boost/thread>

void dummy() {}

int main(int, char*[]) {
   boost::thread x(dummy);
   boost::thread y(dummy);
   ...
   return 0;
}

Сколько там потоков? Два (х и у) или три (х, у и главное)? Могу ли я позвонить boost::this_thread::yield() в основном? И что я получу от звонка boost::this_thread::get_id() в основном?

Ответы [ 3 ]

25 голосов
/ 19 августа 2009

В каждом случае вы создали два дополнительных потока, поэтому у вас есть три (x, y и main). Вы получите разные идентификаторы в каждом из потоков, включая вызов в main.

0 голосов
/ 17 июня 2014

Все три вышеприведенных реализации дают одинаковые результаты. Поскольку std :: thread реализован поверх pthread, все создадут три потока. Main будет вашим родительским потоком, а остальные станут дочерними потоками и будут иметь разные идентификаторы при создании каждого потока, и boost :: thread создается тем же автором, что и std :: thread, но с некоторыми улучшениями.

0 голосов
/ 26 августа 2009

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

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

...