Member 14509698 Ответов: 2

Вопрос относительно создания pthread в linux


Я изучаю c++ и наткнулся на приведенный ниже код, в котором я не понимал нижнюю строку.
РЦ = pthread_create(&амп;, (недействительными *)&ампер потоков[я], нулем, PrintHello;тд[я]);

Где,
rc = код возврата в int
thread - это pthread_t threads[5]
PrintHello - это threadRoutine
td-это структура с 2 переменными 1-это int thread_Id, а другая-char* msg

Я не понял, почему (1-й аргумент) передается как ссылка и (последний аргумент) td typecasted to (void*)

Полный код:
структура thread_data {
инт thread_id;
char *сообщение;
};

void *PrintHello(void *threadarg) {
структура thread_data *my_data;
my_data = (struct thread_data *) threadarg;

соиь <&ЛТ; "идентификатор потока :" &ЛТ;&ЛТ; my_data-&ГТ;thread_id ;
соиь <&ЛТ; "сообщение :" &ЛТ;&ЛТ; my_data-и GT;сообщение на << епси;

pthread_exit(NULL);
}

тап_п () {
потоков pthread_t[NUM_THREADS];
структура thread_data тд[NUM_THREADS];
int rc;
int i;

для( i = 0; i < NUM_THREADS; i++ ) {
соиь <&ЛТ;"основной() : создание темы", &ЛТ;&ЛТ; я &л;< епси;
тд[я].thread_id = я;
td[i].message = "это сообщение";
РЦ = pthread_create(&амп;, (недействительными *)&ампер потоков[я], нулем, PrintHello;тд[я]);

if (rc) {
cout << "ошибка:невозможно создать поток", << rc << endl;
выход(-1);
}
}
pthread_exit(NULL);
}

Что я уже пробовал:

Читал ссылки но так и не понял зачем это здесь нужно

2 Ответов

Рейтинг:
1

megaadam

Я на 100% согласен с CPallini. Но для того чтобы помочь ОП я хотел бы прояснить вот что:

Передается ли аргумент по ссылке или по значению, определяется только объявлением функции, а не вызовом функции. Если и только если у вас есть "&" в объявлении функции: аргумент передается по ссылке.

Отвечая на более широкий вопрос: "почему в этом звонке есть &?" Ваш код не будет компилироваться (попробуйте!) без него, так как pthread_create() требует указателя на тип pthread_t.
pthread_create(3) - Страница руководства Linux[^]


Рейтинг:
0

CPallini

В нижеприведенной строке

pthread_create(&threads[i], NULL, PrintHello, (void *)&td[i]);
первый аргумент не передается по ссылке (in C++ вы не должны использовать & оператор в вызове по ссылке). Это вместо того, чтобы адрес (т. е. указатель на) из а pthread_t переменная (а именно это адрес threads[i], то есть яth элемент массива threads) в соответствии с требованиями pthread_create[^] функция.


k5054

Рискуя запутать ОП, я бы сказал, что первый аргумент действительно "передается по ссылке", но нет - прошел как ... Справочник по c++ Термин "передается по ссылке" в информатике используется для обозначения того, когда аргумент передается по указателю, и поэтому может быть изменен в подпрограмме. Это контрастирует с"переданным по значению", когда передается копия значения, и любые изменения, внесенные в подпрограмму, не отражаются в вызывающем объекте.

CPallini

В C++ вся ссылка is not passed by (C++) передается по значению. Первый аргумент-это указатель, передаваемый по значению.

Richard MacCutchan

Я согласен с Карло. Эти два параметра передаются по указателю на адрес, а не по ссылке.