Posix темы с языком c - PullRequest
       11

Posix темы с языком c

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

void *work(void *i){
      int f = *((int *)(i));
      printf("Hello, world from %i with value %i\n",
             pthread_self(), f);
      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, (void *)(&i))){
                  printf("Error creating the thread\n"); exit(19);}
      }
      return 0;
}

выход должен быть:

Hello, world from 2 with value 1
Hello, world from 3 with value 2
Hello, world from 6 with value 5
Hello, world from 5 with value 5
Hello, world from 4 with value 4
Hello, world from 8 with value 9
Hello, world from 9 with value 9
Hello, world from 10 with value 9
Hello, world from 7 with value 6
Hello, world from 11 with value 10

это опять не домашняя работа. это некоторый код, с которым я сталкиваюсь в какой-то ссылке, но posix не является моей областью, поэтому я просто хочу то, что достаточно, чтобы понять это
мои вопросы:

  • что это значит int f = * ((int *) (i)); ??? я имею в виду указатели, написанные как эти, я не могу их понять
  • что это значит (void *) (& i))
  • pthread_create возвращает нулевое или ненулевое значение в случае успеха? в выводе давайте возьмем первую строку, например, как получается значение 1 !! не должно ли быть ноль, так как я ноль
  • влияет ли ++ на этот вывод?

Ответы [ 3 ]

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

что это значит int f = *((int *)(i)); ???

Он преобразует i в int *, разыменовывает его и присваивает значение f.

что это значит (void *)(&i))

Он берет указатель на i и переводит его в void *.

делает pthread_create возвращает нулевое или ненулевое значение в случае успеха?

pthread_create возвращает ноль в случае успеха.

в выводе, давайте возьмем первую строку, например, как получилосьесть значение 1 !!не должно ли быть ноль, так как я ноль

Вы бы так подумали, но это не так.Каждый поток выполняется асинхронно от всех остальных и читает значение i во время выполнения , а не во время его запуска;как таковые, результаты на самом деле непредсказуемы.Программа, которую вы здесь запускаете, выглядит так, как будто она должна продемонстрировать этот точный эффект.

влияет ли ++i на этот вывод?

Э-э ... да?Цикл не завершился бы без него.

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

что это значит int f = * ((int *) (i));

int f = *((int *)(i)); означает приведение i к int*, а затем разыменованиеэтот указатель для получения значения int по адресу.Вы можете разбить его на два этапа:

int *temp = (int*)i;
int f = *temp;

что это значит (void *) (& i))

(void *)(&i) просто приводит адрес imain это int*) до void*.

pthread_create возвращает нулевое или ненулевое значение в случае успеха?

Со страниц справочника:

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

  On  success,  pthread_create() returns 0; on error, it returns an error
  number, and the contents of *thread are undefined.

в выводе возьмем одну строку, например, как получается значение 1 !!не должно ли оно быть нулевым, так как я равен нулю

Вы передаете указатель на i функции потока, и поскольку основной поток и этот новый поток работают параллельно,i может быть обновлено в цикле for (++i), прежде чем оно будет доступно в work.

влияет ли ++ на этот вывод?

Да, это аргумент, передаваемый вашей функции потока.Это число после "...with value" в выводе.

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

Во-первых, давайте посмотрим:

f = *((int *)(i));

Поскольку i является void *, его нельзя юридически разыменовать, поэтому сначала оно приводится к int *, разыменование которого дает значение типа int, как исключено. присвоение адреса i пустоте * является обратной операцией; так как функция pthread принимает void *, но адрес типа int имеет тип int *, такое преобразование приятно выполнить.

pthread_create возвращает ноль в случае успеха: http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_create.html

Да, ++ i влияет на вывод, так как он увеличивает i на единицу, таким образом, следующая отправленная функция потока будет предоставлена ​​в качестве аргумента со значением, превышающим значение предыдущего вызова. Вот почему «значение» увеличивается во время программы.

...