Вопросы о POSIX Threads в C - PullRequest
       41

Вопросы о POSIX Threads в C

4 голосов
/ 09 января 2012
#include <pthread.h>
#define NUM_THREADS 4

void *work(void *i){
    printf("Hello, world from %i\n", pthread_self());
    pthread_exit(NULL); 
}

int main(int argc, char **argv){
    int i;
    pthread_t id[NUM_THREADS];
    for(i = 0; i < NUM_THREADS; ++i){
       if(pthread_create(&id[i], NULL, work, NULL)){
          printf("Error creating the thread\n"); exit(19);
       } 
    }
    printf("After creating the thread. My id is: %i\n",
    pthread_self());
    return 0;
}

я знаю, что результат:

Hello, world from 2
Hello, world from 3
After creating the thread. My id is: 1
Hello, world from …

Прежде всего, это не домашняя работа.POSIX не является моей областью, поэтому я просто хочу объяснить вывод (нет необходимости объяснять используемые функции, так как я знаю, что они делают) некоторые быстрые ответы:

  1. являются идентификаторами для pthreads (2,3, 1) указано системой
  2. используемый ++i ... это как-то повлияло на вывод?
  3. почему в конце всего 4 потока (3 + основной), почему не 5?!
  4. почему после основного печатного После создания .... выполняется другой поток ?? !!как получилось ?? !!

Ответы [ 4 ]

4 голосов
/ 09 января 2012
  1. Я не уверен, указано ли это, но я верю (почти?), Все идентификаторы потоков начинаются с 1 (основной) и увеличиваются оттуда.
  2. Нет, ++i имеетне имеет ничего общего с выводом.
  3. Поскольку вы не pthread_join потоков, функция main (и, следовательно, программа) вышли до того, как последний поток был выполнен.
  4. I 'Я не уверен, что именно вы пытаетесь спросить здесь, но ответ параллелизм.Нет гарантии, когда или в каком порядке выполняются потоки.
1 голос
/ 09 января 2012

3 & 4: потоки асинхронны: при pthreads, когда вы выходите из основной функции, все потоки завершаются, независимо от того, закончили они или нет.

Таким образом, только 3 потока были напечатаны до выхода из основногоцикл, 1 печатается между оператором печати main и return, и один поток не зашел так далеко.

1 голос
/ 09 января 2012
  1. Это идентификаторы потоков внутри текущего процесса.
  2. Нет, i не влияет на вывод, потому что вы не передаете его потокам в качестве параметра и не получаете к нему доступ извнутри кода потока.Таким образом, это просто переменная цикла.
  3. Я не знаю, сколько есть выходов, потому что вы не даете нам полный вывод.Я согласен, что обычно должно быть 5 потоков.Возможно, некоторые потоки не успевают напечатать свое сообщение до выхода из основного потока.Вы должны присоединиться к ним перед выходом из основного потока.
 for(i = 0; i < NUM_THREADS; i++)
 {
     pthread_join(id[i], NULL);
 }

4.Потоки запускаются параллельно основному потоку.Поэтому код каждого из потоков, которые вы запускаете, выполняется одновременно с кодом основного потока после их запуска.Это означает, что основной поток продолжает выполнять printf, пока дочерние потоки выполняют свою работу, поэтому выходные данные чередуются "случайным" образом.

0 голосов
/ 09 января 2012

pthread_self не возвращает числовой тип, но непрозрачный тип pthread_t (который может быть непрозрачным struct).

Я предлагаю вам очистить ваш массив с помощью

  memset(id, 0, sizeof(id));

Действительно, в GNU / Linux / Debian / Sid / x86-64 внутренний включаемый файл /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h содержит

  typedef unsigned long int pthread_t;

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

Я предлагаю вам прочитать хороший учебник по темам, например, например. этот Блейз Барни

На современных многоядерных машинах потоки [могут] действительно работать параллельно на разных ядрах.

...