Как правильно передать параметры в поток в c многопоточности - PullRequest
4 голосов
/ 19 ноября 2010

Я пытаюсь научиться многопоточности на Си, и я видел несколько редких вещей.

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

pthread_t tid[MAX_THREADS]
int n_veg
pthread_create(&tid[n],NULL,caracter,(void *)n_veg)

символ, очевидно, является предварительно объявленной функцией.

Теперь, почему мы используем приведение пустого указателя вместо преобразования указателя int?Есть ли какая-либо существенная разница?

Во-вторых, почему мы используем приведение указателей в первую очередь?Разве мы не можем использовать «& n_veg», как с первым параметром?

Заранее спасибо.

Ответы [ 2 ]

10 голосов
/ 19 ноября 2010

Поскольку оба ваших вопроса связаны, я отвечу на них вместе: pthread_create принимает параметр void *, так что вы действительно можете передать любой указатель, какой захотите. В этом случае, однако, мы на самом деле не передаем указатель, а просто целое значение, приведенное в качестве указателя. Это означает, что вы получите к нему доступ таким образом: caracter:

int value = (int)n_veg;

Как вы упомянули, вы вполне могли бы передать фактический указатель как &n_veg и получить значение следующим образом:

int value = *(int *)n_veg;

На самом деле, в большинстве случаев вам нужно будет передать больше данных, чем просто целое число, например структуру, и в этом случае вы должны передать указатель, так как вы не можете просто приведите его к указателю как целое число.

При передаче указателя следует помнить, что n_veg не должен выходить из области действия, пока поток работает. Например, если вы делаете:

void test() {
  int n_veg;
  pthread_create(&tid[n],NULL,caracter,&n_veg);
}

затем &n_veg будет недействительным, как только вернется test, но поток все еще может быть запущен и будет содержать неверный адрес. Из-за этого структуры, передаваемые потокам, обычно распределяются динамически, например, с использованием malloc, и поток может free завершить его.

0 голосов
/ 19 ноября 2010

pthread_create определяется следующим образом:

int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr,
     void *(*start_routine)(void *), void *restrict arg);

Таким образом, он ожидает void * в качестве последнего параметра. Если вы опустите приведение, компилятор выдаст вам предупреждение.

...