2015-04-18 4 views
-3

В коде внизу, в чем заключается роль конструкции int sid=*(int*)args?Значение конструкции C

void *thread_p(void *args) 
{ 
    int sid=*(int*)args,i,size=0;***This initialisation in the thread function means what?*** 
    char msg[100]; 

    while(1) 
    { 
      for(i=0;i<100;i++) 
       msg[i]='\0'; 

      recv(sid,msg,100,0); 
      printf("\nClient:%s",msg); 
      printf("\nServer:"); 
      gets(msg); 

      size=strlen(msg); 
      send(sid,msg,size,0); 
      if((strcmp(msg,"exit"))==0) 
      { 
       close(sid); 
       exit(1); 
      } 
    } 
} 
+3

Это не имеет никакого отношения к многопоточности, но все с использованием языка программирования, который вы используете. Это именно так? При этом, считая C, правая часть оценивается как '* ((int *) args)', то есть сначала отбрасывается на 'int *', затем разыгрывается. –

+0

Другими словами, sid присваивается значение int, на которое указывает args. Предполагается, что args указывает на адрес, где хранится значимый int. –

+0

Это означает, что вы читаете 'sizeof (int)' bytes из адреса, на который указывает 'args', и записывая эти байты в локальную переменную' sid'. Если адрес, на который указывает 'args', не привязан к' int' (т. Е. Не делится на 'sizeof (int)') ** И ** ваша платформа (компилятор + HW) не поддерживает операции выравнивания нагрузки/хранения, то это приведет к ошибке во время выполнения (либо прямое ** нарушение доступа к памяти, либо, что еще хуже, вы получите некоторые «нежелательные» данные в переменной 'sid', и ваша программа будет вести себя неожиданно ** в некоторой случайной точке * * позже в исполнении). –

ответ

0

Я собираюсь сделать здесь предположение, что thread_p представляет собой процедуру запуска pthread_create. Такая процедура запуска требуется для принятия указателя void, который в C и C++ означает указатель на нетипизированный блок памяти. Теперь, в дополнение к начальной процедуре, pthread_create также принимает аргумент указателя void, который он передает в начальную процедуру. Для вызова вызова pthread_create с кодом в начальной процедуре зависит от вызывающего пользователя pthread_create. Поэтому, если начальная процедура, заданная pthread_create, предполагает, что указатель void указывает на, скажем, целое число, тогда вызов pthread_create должен передать указатель на целое число в качестве параметра arg, чтобы синхронизировать ситуацию. Это небезопасный интерфейс типа. Компилятор не поможет вам убедиться, что они синхронизированы, а если нет, вы получите неопределенное поведение.

Ваша функция thread_p предполагает, что переданный ей аргумент фактически указывает на целое число. Сначала он набирает указатель void на целочисленный указатель (то есть часть (int *) args), а затем разыгрывает указатель, чтобы получить целое число, на которое он указывает (это * перед аргументами (int *)). Если вызывающий объект pthread_create передал ему thread_p, но не смог передать адрес int в качестве параметра arg, код имел бы неопределенное поведение.

Смежные вопросы