Я довольно новичок в C и пытаюсь понять темы и указатели. Насколько я знаю, эта строка создает поток
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
Четвертый аргумент принимает аргумент для функции указателя (void *)t
, и это указатель на адрес переменной t
, которая являетсяlong
тип? И функция указателя принимает аргумент пустого указателя на переменную, который равен (void *)t
.
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 20
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
/* Last thing that main() should do */
pthread_exit(NULL);
}
После этого я изменил функцию указателя и pthread_create
на это:
{
long taskid;
sleep(1);
taskid = *(long *)threadid;
printf("Hello from thread %ld\n", taskid);
pthread_exit(NULL);
}
rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
Так что теперь указатель void все еще указывает на адрес переменной t
?
И *(long *)threadid
разыменовывает переменную t
? И он выводит окончательное значение t
во всех потоках.
Я не уверен, правильно ли я понимаю, если я что-то неправильно понял, я ценю любой совет. У меня вопрос к (void *)t
и (void *) &t
, они оба являются указателями на адрес переменной t
, и я читаю указатели могут указывать только адреса, но не значения, так почему (void *)t
выводит инкрементзначения t
? taskid = *(long *)threadid;
И если я просто наберу taskid = threadid
, он печатает адрес t
, что делает *(long *)
? *
вне скобок разыменовывается?