Я только что начал изучать pthreads API, и я следую учебному руководству здесь
Однако в примере программы pthread_create
, пример программы создает длинную переменную и передает ее значение, преобразованное тип как void*
. В функции записи потока это разыменовывает его точно так же, как длинное.
Действительно ли это законно? Я понимаю, передаю ли я адрес переменной t
, каждый поток действовал бы на ту же переменную а не на копию его. Мы можем сделать это, потому что это - a void*
и компилятор понятия не имеет, о каком типе мы отправляем?
#include
#include
#define NUM_THREADS 5
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
Это работает, пока sizeof (long) <= sizeof (void *)
, и что каждое значение long
может быть представлено как недействителен *
.
Лучше было бы передать адрес переменной. Вы можете преобразовать из T *
в void *
и обратно безопасно и без предположений.
Это так же законно, как и любой вид приведения типов. Дело в том, что со значением, на которое указывает аргумент, ничего нельзя сделать, пока оно не будет приведено к типу, поэтому tid = (long) threadid
.
Проверьте старые вопросы и ответы Когда использовать недействительный указатель? .