Мне нужно научиться использовать многопоточность при добавлении или удалении значения в векторе. Я создала функцию CopyDataTo, чтобы вывести на экран, что у меня записано в векторое после операций, и мне нельзя использовать operator[].
std::size_t CopyDataTo(T* pOutData, std::size_t firstIndex, std::size_t numData)
{
std::size_t lastIndex = firstIndex + numData;
const std::size_t indexAfterLast = std::min(firstIndex + numData, v_.size());
m_.lock();
std::copy(v_.begin() + firstIndex, v_.begin() + indexAfterLast, pOutData);
m_.unlock();
return *pOutData;
}
private:
std::vector<T> v_;
Теперь я создала две функции и делаю там добавления и удаления из вектора. В main создала два потока и записала туда функции.
std::vector<int> v1;
void f3()
{
int i = 9;
v1.push_back(i);
v1.back();
}
void f4()
{
int i = 6;
v1.push_back(i);
v1.back();
v1.pop_back();
}
int main()
{
std::thread t1(f3);
std::thread t2(f4);
t1.join();
t2.join();
int pOutData;
for(int i = 0; i < v1.Size(); ++i)
{
std::cout << v1.CopyDataTo(&pOutData, 0, v1.Size()) << "\n";
}
return 0;
}
Теперь я хочу чтобы, вы мне помогли. Я Часть кода уже исправила, спасибо Вам, теперь мне нужно мой код сделать рабочим. И нужна ваша помощь: Оксана у тебя в этой строке фигня, нужно так делать и т.д. Буду вам благодарна за помощь
UPD:
ThreadSafeVector<int> v1;
void f3()
{
v1.PushBack(5);
v1.PushBack(9);
}
void f4()
{
v1.PushBack(2);
v1.PushBack(1);
}
int main()
{
std::thread t1(f3);
std::thread t2(f4);
t1.join();
t2.join();
int* pOutData = new int[v1.Size()];
size_t size = v1.CopyDataTo(pOutData, 0, v1.Size());
for (int i = 0; i < size; ++i)
std::cout << pOutData[i] << "\n";
return 0;
}
std::copy работает с итераторами, а не с индексами.
std::copy(v.begin() + firstIndex, v.begin() + indexAfterLast, pOutData);
std::size_t rezult =
size_t встроенный тип - тот же unsigned int, не из пространства std...
std::copy(v_.begin() + firstIndex, v_.begin() + indexAfterLast, pOutData);
это ошибка, так как copy возвращает итератор записи, а не size_t...
В данном примере он возвратит T*
Перегрузите operator<< для вашего класса:
#include <iostream>
#include <algorithm>
#include <iterator>
template<class T>
std::ostream& operator<<(std::ostream &os, const ThreadSafeVector<T> &v){
v.lock();
std::copy(v.begin(), v.end(), std::ostream_iterator<T>(os, " "));
v.unlock();
return os;
}
Теперь можете писать так:
std::cout << v1 << std::endl;
Я вызвал методы lock и unlock, не уверен что они есть у вас, если нет, то добавьте, т.к. иначе число элементов вектора может измениться пока работает std::copy.
Да я понимаю, что в вопросе было про диапазон. Но я не вижу где бы вам это могло понадобиться, вы все равно пытаетесь вывести все.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей