Печать значений массива, переданных через структуру, через Pthread_Create в C ++ - PullRequest
1 голос
/ 21 сентября 2019

Моя цель состоит в том, чтобы second_func напечатать для экранирования как параметр размера, так и первый векторный элемент, содержащийся в структуре, переданной ему из p_thread create.Проблема заключается в печати векторного элемента.У меня есть следующий код:

#include <iostream>
#include <bits/stdc++.h>
#include <pthread.h>

using namespace std;
void first_func(vector<int>& vect);
void * second_func(void * args);

struct t_args {
   vector<int> *vect;
      int size;
   };

int main() {
   vector<int> vect;
   vect.push_back(100);
   first_func(vect);
   return 0;
}

void first_func(vector<int>& vect) {
   int record;                            
   pthread_t thread;                  
   struct t_args args;             
   args.vect = &vect;                   
   args.size = 5;                      
   record = pthread_create(&thread, NULL, &second_func, (void *)&args);
   if (record) { 
      cout << "Error - Not able to create thread." << record << endl;
      exit(-1);
    }
    pthread_join(thread, NULL);
}

void * second_func(void * args) {
   struct t_args params = *(struct t_args*) args;
   cout << "The value of the size param is " <<  params.size << endl;
   cout << "The value of the first element of the vector is " << params.vect[0] << endl;
   pthread_exit(NULL);
}

Это вызывает следующую ошибку.

something.cpp: In function ‘void* second_func(void*)’:
something.cpp:38:63: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘std::vector<int>’)
    cout << "The value of the first element of the vector is " << params.vect[0]

Полное сообщение об ошибке довольно длинное, но это суть.Программа была скомпилирована с помощью следующей команды:

g++ file.cpp -std=c++11 -lpthread -o file

Я почти уверен, что это проблема, связанная с указателями и правильным синтаксисом разыменования, однако после многих попыток и изменения синтаксиса сохраняется некоторая форма ошибки,

1 Ответ

1 голос
/ 21 сентября 2019
vector<int> *vect;

объявляет указатель на vector.

params.vect[0]

Будет обрабатывать эту строку указателя массивом и даст вам первый vector, а не первый элемент указанного в vector.

params.vect[0][0]

, чтобы получить первый vector, а затем первый элемент этого первого vector или значительно менее вводящий в заблуждение, поскольку существует только один vector

(*params.vect)[0]
 ^ dereference operator gets vector at pointer

Получит нужный элемент.

Кстати, будьте очень осторожны, передавая указатели на локальные переменные в потоки.На этот раз вы в безопасности, так как локальная переменная ограничена main, и если main выходит, то и программа, и поток (обычно. Я не видел случая, когда POSIX запускается, когда он не ( Но, видимо, вы можете сделать это )).Однако, если вы вызываете функцию для раскручивания потока и используете локальную переменную для этой функции в потоке, вероятность того, что к моменту запуска потока функция вернется, и переменная выйдет из области видимости, очень высоки.Это очень плохая сцена - использовать переменную, когда она выходит из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...