Простая C ++ программа для печати pthread ID - PullRequest
0 голосов
/ 25 сентября 2018

Итак, я пытался запустить это, но не могу понять, что не так.Мое единственное намерение - создать pthreads и вывести их идентификаторы на консоль.Я только начал работать с c ++, поэтому я не уверен, в чем дело.Можете ли вы взглянуть на это и, возможно, помочь мне?Спасибо

void *printer(void* temp)
{
    pthread_t self_id; 
    int ret;
    self_id=pthread_self();
    printf("\nThis is pthread %u\n",self_id);
    return NULL;
}

int main (int argc, char* argv[])
{
    pthread_t create;
           int ret;
           ret = pthread_create(&create, NULL, &printer, NULL);
}

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Ваша проблема в том случае, если «основной» поток завершает работу, все дочерние потоки будут уничтожены.

Таким образом, вы должны заставить «главный» поток ждать, пока все дочерние потоки не будут завершены.

     pthread_t create;
     int ret = pthread_create(&create, NULL, &printer, NULL);
     if (ret == 0) {
         pthread_join(create, nullptr);  // wait for thread to finish.
     }

Я бы добавил, что это:

      i < argv[1]

Не делает то, что вы думаете, что делает.Обратите внимание, что тип argv char*[].то есть это массив указателей на символы.Пока я целое число.Теперь он компилируется, поскольку целые числа легко конвертируются в указатели (но, вероятно, генерирует предупреждение).

Вам необходимо преобразовать строку в argv[1] в целое число, прежде чем сравнивать ее с i.

0 голосов
/ 25 сентября 2018
    for (int i = 1; i < argv[1]; ++i)

неверно в вашем mainreturn ret неверно в printer), потому что i является целым числом, но argv[1] имеет тип char*, так же как и указатель.Возможно, вы имеете в виду (в вашем main):

   int n = atoi(argv[1]);
   for (int i=1; i<n; i++)

Не забудьте скомпилировать все предупреждения и информацию об отладке: g++ -Wall -Wextra -g с GCC для кода C ++ или gcc -Wall -Wextra -Wmissing-prototypes -g дляС кодом.В C ++ вы можете использовать <thread>.Улучшайте свой код, чтобы вообще не получать предупреждений.Прочитайте Как отлаживать небольшие программы .Узнайте, как использовать gdb отладчик .

Обратите внимание, что return -1 - это плохой вкус в вашем main (по крайней мере, в Linux см. execve (2) и прочитайте об отношениях между main и execve в вашей оболочке).Вы должны вернуть EXIT_FAILURE (или использовать exit для этого).

Кстати, pthread_t обычно является целым типом, но стандарт POSIX нене указывать, какой.Если вы хотите напечатать один, на практике вам лучше привести его явно к какому-нибудь достаточно широкому целочисленному типу, например long long и коду printf("This is pthread %lld\n",(long long) self_id);, который не выдаст вам никакого предупреждения.

Наконец, я рекомендую сначала изучить язык программирования (C намного проще, чем C ++, и вам нужно выбирать между ними) и использовать его для последовательного программирования, а позже обучение pthreads .Параллельное программирование потоков - сложная тема.Начиная с многопоточного программирования, вы ставите планку слишком высоко.Прежде чем пытаться использовать pthreads, изучите основы последовательного программирования.Смотрите также http://norvig.com/21-days.html для полезного понимания.Кстати, если вы никогда не программировали, SICP является отличным введением (в нем не используются C или C ++ или потоки).

Конечно, вы не позволяете другим вашим потокам работать достаточновремя.Вы могли бы sleep немного - в главном потоке - перед возвратом из main, и вам действительно следует дождаться своих потоков, как объяснил Мартин Йорк .

Но я думаю, что вам нужно изучить последовательное программирование, прежде чем пытаться использовать многопоточность.

...