Вопрос

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

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

#include <thread>

void dummy() {}

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

Сколько там нитей?Два (x и y) или три (x, y и основной)?Могу я позвонить 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;
}

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

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

#include <boost/thread>

void dummy() {}

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top