Я тренируюсь, используя указатели, и наткнулся на то, чего я не понимаю.Программа делает это:
- Создание вектора
- Передача адреса вектора в функцию
- Эта функция имеет цикл for
- В этомfor-loop у пользователя запрашивают название фильма
- После получения имени фильма создается новый объект фильма (из структуры)
- Для каждого фильма создается новый поток повышения, передаваязаголовок, созданный пользователем, и указатель как для нового объекта фильма, так и для вектора.
- В теме повышения переменной "title" объекта фильма присваивается заголовок, который создал пользователь, и фильм затемдобавлено к вектору
- Когда все потоки завершены, цикл for внутри функции "main" показывает все заголовки фильмов, хранящиеся в векторе.
Проблема возникает при переключенииэти два
//Get info about new movie from user
string movieTitle;
int movieYear; //Not used at the moment
cout << "Enter title for movie " << (i+1) << endl;
getline(cin,movieTitle);
и
//Create new movie
movies_t amovie;
movies_t * pmovie;
pmovie = &amovie;
Когда я помещаю «часть пользовательского ввода» над частью «создать новый фильм», как сейчас, я получаю это:
Но когда я поменяю их местами:
Я не понимаю почему, потому что они вообще не влияют друг на друга.
Данные отображаются так:
for(i=0;i<movieVector.size();i++)
{
cout << movieVector[i].title << endl;
}
Это соответствующие функции (основныеи newThreads)
void newThreads(vector<movies_t> *movieVectorPointer)
{
boost::thread_group group; //Start thread group
int i;
for(i=0; i<2; i++) //Make X amount of threads (2 in this case)
{
//Get info about new movie from user
string movieTitle;
int movieYear; //Not used at the moment
cout << "Enter title for movie " << (i+1) << endl;
getline(cin,movieTitle);
//Create new movie
movies_t amovie;
movies_t * pmovie;
pmovie = &amovie;
//Let user know we are now starting on this thread
cout << "Doing thread " << i << endl;
//Start new thread
newThreadStruct startNewThread(movieTitle,movieYear,pmovie,movieVectorPointer);
group.create_thread(startNewThread);
}
group.join_all(); //Wait for all threads in group to finish
}
int main()
{
cout << "Hello world!" << endl; //I am born.
vector<movies_t> movieVector; //Create vector to store movies in
newThreads(&movieVector); //Start making new threads. Pass movieVector's address so it can be used within threads.
/* The below code will not be executed until all threads are done */
cout << "Amount of movies " << movieVector.size() << endl; //Let user know how many movies we made
//Show all movies we made
int i;
for(i=0;i<movieVector.size();i++)
{
cout << movieVector[i].title << endl;
}
cout << "Bye world!" << endl; //This life has passed.
return 0;
}
А вот полный код на случай, если это имеет значение:
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
//A movie will hold a title and a year. Only title is used in this code.
struct movies_t {
string title;
int year;
};
//This function is where the data is added to our new movie,a fter which our finished movie will be added to the vector. It is called from within the "newThreadStruct" operator.
int doMovieWork(string movieTitle,int movieYear,movies_t *moviePointer,vector<movies_t> *movieVector)
{
moviePointer->title = movieTitle; //Add title to new movie
movieVector->push_back(*moviePointer); //Add movie to vector
return 0;
};
//This struct will be used to create new Boost threads. It accepts various arguments.
struct newThreadStruct
{
newThreadStruct(string movieTitle,int movieYear,movies_t *moviePointer,vector<movies_t> *movieVector) : movieTitle(movieTitle),movieYear(movieYear),moviePointer(moviePointer),movieVector(movieVector) { }
void operator()()
{
doMovieWork(movieTitle,movieYear,moviePointer,movieVector);
}
string movieTitle;
int movieYear;
movies_t *moviePointer;
vector<movies_t> *movieVector;
};
void newThreads(vector<movies_t> *movieVectorPointer)
{
boost::thread_group group; //Start thread group
int i;
for(i=0; i<2; i++) //Make X amount of threads (2 in this case)
{
//Get info about new movie from user
string movieTitle;
int movieYear; //Not used at the moment
cout << "Enter title for movie " << (i+1) << endl;
getline(cin,movieTitle);
//Create new movie
movies_t amovie;
movies_t * pmovie;
pmovie = &amovie;
//Let user know we are now starting on this thread
cout << "Doing thread " << i << endl;
//Start new thread
newThreadStruct startNewThread(movieTitle,movieYear,pmovie,movieVectorPointer);
group.create_thread(startNewThread);
}
group.join_all(); //Wait for all threads in group to finish
}
int main()
{
cout << "Hello world!" << endl; //I am born.
vector<movies_t> movieVector; //Create vector to store movies in
newThreads(&movieVector); //Start making new threads. Pass movieVector's address so it can be used within threads.
/* The below code will not be executed until all threads are done */
cout << "Amount of movies " << movieVector.size() << endl; //Let user know how many movies we made
//Show all movies we made
int i;
for(i=0;i<movieVector.size();i++)
{
cout << movieVector[i].title << endl;
}
cout << "Bye world!" << endl; //This life has passed.
return 0;
}