Примечание 1. Если у вас есть только 1 процессор, код может выполняться только последовательно, независимо от того, сколько потоков вы создаете. Каждому потоку дается часть процессорного времени перед его заменой на следующие потоки.
Примечание 2: Если основной поток завершает работу, pthreads уничтожит все дочерние потоки, прежде чем они получат шанс на выполнение.
Теперь, чтобы ответить на ваши вопросы:
Без сна. Один раз запущенный поток имеет достаточно времени в одном срезе, который ему был дан, чтобы полностью выполнить цикл 10 раз.
Со сном: ваш рабочий поток будет спать в течение полной секунды. Так что ваш главный поток успевает проделать большую работу. Если основной поток завершится в это время, рабочий будет убит.
Я бы внес следующие изменения:
// Remove the Create() method
// Put thread creation in the constructor.
// Make the thread variable part of the object
pthread_t m_id;
Thread()
{
if (pthread_create(&m_id, NULL, &(this->start_routine_trampoline), this) != 0)
{
throw std::runtime_error("Thread was not created");
}
}
// Make sure the destructor waits for the thread to exit.
~Thread()
{
pthread_join(m_id);
}
Если вы пойдете и посмотрите на библиотеку повышения потоков . вы обнаружите, что обо всех таких мелких ошибках уже позаботились; Это упрощает использование потоков.
Также обратите внимание. Использование статики может работать, но оно не переносимо. Это потому, что pthread's является библиотекой C и поэтому ожидает указатель на функцию с C ABI. Вам просто повезло с вашей платформой здесь. Вы должны определить это как функцию и объявить ABI, используя extern "C"
// This needs to be a standard function with C Interface.
extern "C" void *start_routine_trampoline(void *p)
{
}