Не могу понять вывод потока

0

Я попытался скомпилировать следующий код из учебника, используя онлайн-компилятор. Вот код:

#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>

using namespace std;

#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long *tid;
   tid = (long*)threadid;
   cout << "Hello World! Thread ID, " << *tid << endl;
   pthread_exit(NULL);
}

int main ()
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long i;
   for( i=0; i < NUM_THREADS; i++ ){
      cout << "main() : creating thread, " << i << endl;
      rc = pthread_create(&threads[i], NULL, 
                          PrintHello, (void *)&i);
      if (rc){
         cout << "Error:unable to create thread," << rc << endl;
         exit(-1);
      }
   }

   sleep(1000000);
   pthread_exit(NULL);
}

Это результат:

main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
main() : creating thread, Hello World! Thread ID, 23

main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
Hello World! Thread ID, 1
main() : creating thread, 2
Hello World! Thread ID, 2
main() : creating thread, 3
Hello World! Thread ID, 3
main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5
main() : creating thread, 0
main() : creating thread, 1
main() : creating thread, 2
Hello World! Thread ID, 2main() : creating thread, 3

main() : creating thread, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 4
Hello World! Thread ID, 5

Почему "создание потока, x" написано несколько раз выше? Цикл должен был работать сразу? пс. Также, когда я запускаю этот код в одном компиляторе, ничего не выводится. имп. Я немного изменил пример, пример напрямую проходил (void *)i в поток, который мне не понравился.

  • 0
    Проходя, i нравится, это не сработает. Вы отправляете указатель на одну и ту же переменную для каждого потока. Вы, вероятно, хотели отправить разные данные в каждый поток.
  • 0
    @LightnessRacesinOrbit: Хороший вопрос, но я имел в виду что-то еще. Я жаловался на то, что "main (): создание потока, х" выводится несколько раз
Показать ещё 12 комментариев
Теги:

2 ответа

0
Лучший ответ

Попробуйте запустить тот же код без линии сна. Мне кажется, что что-то не так с онлайн-инструментом.

  • 0
    Да. Это отличается между пробегами, но это в порядке. Удалите сон из второго примера кода, и он тоже работает нормально. Если ничего не указано, нажмите F5, вставьте и снова запустите код.
  • 1
    Этого следовало ожидать. Вы передаете указатель i в ваши темы. Имейте в виду, что вы не можете контролировать, когда потоки будут выполняться и когда они будут прерваны. Таким образом, цикл увеличивает значение i, и ваш поток показывает значение i в тот момент времени, а не значение, которое он имел при создании потока.
Показать ещё 1 комментарий
1

Это потому, что вы передаете тот же указатель на все потоки. Адрес переменной i не изменяется между вызовами pthread_create.

Существует несколько способов решить эту проблему: первый способ - выделить пространство в куче (например, new или malloc) и передать этот указатель на функцию потока. Другая функция, которую я действительно не рекомендую, потому что она зависит от поведения компиляторов, специфичного для реализации, заключается в передаче фактического значения в качестве указателя (например, (void *) i).

Решение, которое я рекомендую, заключается в использовании std::thread вместо функций потока POSIX.

  • 1
    @ pseudonym27: Почему вы не можете написать слово «что-то» полностью?
  • 0
    @ pseudonym27: когда вы обращаетесь за бесплатной помощью, важно позаботиться о ваших комментариях и вопросах.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню