使用 std::vector 和 std::thread
Using std::vector with std::thread
我有一个程序,我在 std::vector 中遍历每个 class ,对其进行一些操作并将其写入新的 std::vector
在我的程序中 std::vector 很大并且在 classes 上完成的操作很耗时。
所以我想知道是否可以使用 std::thread 将 std::vector 上的操作分解为 chunks 。我的意思是
============================== std::vector
^ Processing by a single thread
========== ========== ==========
^ thread 1 ^ thread 2 ^ thread 3
所以理想情况下,我会让线程 1 从 1 到 10,000 个元素线程 2 通过下一个元素块。
最后我还希望输出出现在单个向量中。
所以我不必创建多个 std::vector 并加入它。
如果有帮助,我正在努力创建类似神经网络的东西。虽然不太喜欢它,所以我不能使用它的流行实现。
我尝试了什么:(来自下面的建议)
class obj_thread {
private:
std::mutex m_mutex;
std::vector<int> *_data ;
public:
obj_thread(int _size = 0 )
{
_data = new std::vector<int>(0);
for(int elem_ = 0 ; elem_ < _size ; ++elem_)
_data->push_back(elem_ * 9);
}
~obj_thread()
{
delete _data;
}
void setElemAt(int _val , int _elem)
{
std::lock_guard<std::mutex> locker(m_mutex);
_data->at(_elem) = _val;
};
int getElem(int _elem) const { return _data->at(_elem);}
int getSize() const
{
// std::lock_guard<std::mutex> locker(m_mutex);
return _data->size();
};
};
void zeroOut(std::vector<obj_thread*> * _obj , int _beg , int _end)
{
for(int idx_ = _beg ; idx_ < _end ; ++idx_)
{
for(int idxx_ = 0 ; idxx_ < _obj->at(idx_)->getSize() ; ++idxx_)
_obj->at(idx_)->setElemAt(0,idxx_);
}
}
int main() {
std::vector<obj_thread*> * vec = new std::vector<obj_thread*>(0);
for(unsigned int index_ = 0 ; index_ < _SIZE_ ; ++index_)
vec->push_back(new obj_thread(_SIZE_));
std::thread thread1(zeroOut,vec,_SIZE_/4,_SIZE_/2);
std::thread thread2(zeroOut,vec,_SIZE_/2,_SIZE_*3/4);
std::thread thread3(zeroOut,vec,_SIZE_*3/4,_SIZE_);
thread1.join();
thread2.join();
thread3.join();
return 0 ;
}
在 std::copy 之后模拟您的操作。
沿线的东西
#include <thread>
std::vector<int> in; // make whatever size you want
std::vector<int> out;
auto m_in = in.cbegin() + in.size()/2;
auto m_out = out.begin() + in.size()/2;
std::thread t1(std::copy, in.cbegin(), m_in, out.begin());
std::thread t2(std::copy, m_in, in.cend(), m_out);
t1.join();
t2.join();
这应该会在一个线程中复制传入数组的一半,在另一个线程中复制另一半。未测试!
如果这是你想要的,现在你必须编写类似于 std::copy 的函数,只需将赋值替换为你的域特定处理
我有一个程序,我在 std::vector 中遍历每个 class ,对其进行一些操作并将其写入新的 std::vector
在我的程序中 std::vector 很大并且在 classes 上完成的操作很耗时。 所以我想知道是否可以使用 std::thread 将 std::vector 上的操作分解为 chunks 。我的意思是
============================== std::vector
^ Processing by a single thread
========== ========== ==========
^ thread 1 ^ thread 2 ^ thread 3
所以理想情况下,我会让线程 1 从 1 到 10,000 个元素线程 2 通过下一个元素块。
最后我还希望输出出现在单个向量中。 所以我不必创建多个 std::vector 并加入它。
如果有帮助,我正在努力创建类似神经网络的东西。虽然不太喜欢它,所以我不能使用它的流行实现。
我尝试了什么:(来自下面的建议)
class obj_thread {
private:
std::mutex m_mutex;
std::vector<int> *_data ;
public:
obj_thread(int _size = 0 )
{
_data = new std::vector<int>(0);
for(int elem_ = 0 ; elem_ < _size ; ++elem_)
_data->push_back(elem_ * 9);
}
~obj_thread()
{
delete _data;
}
void setElemAt(int _val , int _elem)
{
std::lock_guard<std::mutex> locker(m_mutex);
_data->at(_elem) = _val;
};
int getElem(int _elem) const { return _data->at(_elem);}
int getSize() const
{
// std::lock_guard<std::mutex> locker(m_mutex);
return _data->size();
};
};
void zeroOut(std::vector<obj_thread*> * _obj , int _beg , int _end)
{
for(int idx_ = _beg ; idx_ < _end ; ++idx_)
{
for(int idxx_ = 0 ; idxx_ < _obj->at(idx_)->getSize() ; ++idxx_)
_obj->at(idx_)->setElemAt(0,idxx_);
}
}
int main() {
std::vector<obj_thread*> * vec = new std::vector<obj_thread*>(0);
for(unsigned int index_ = 0 ; index_ < _SIZE_ ; ++index_)
vec->push_back(new obj_thread(_SIZE_));
std::thread thread1(zeroOut,vec,_SIZE_/4,_SIZE_/2);
std::thread thread2(zeroOut,vec,_SIZE_/2,_SIZE_*3/4);
std::thread thread3(zeroOut,vec,_SIZE_*3/4,_SIZE_);
thread1.join();
thread2.join();
thread3.join();
return 0 ;
}
在 std::copy 之后模拟您的操作。
沿线的东西
#include <thread>
std::vector<int> in; // make whatever size you want
std::vector<int> out;
auto m_in = in.cbegin() + in.size()/2;
auto m_out = out.begin() + in.size()/2;
std::thread t1(std::copy, in.cbegin(), m_in, out.begin());
std::thread t2(std::copy, m_in, in.cend(), m_out);
t1.join();
t2.join();
这应该会在一个线程中复制传入数组的一半,在另一个线程中复制另一半。未测试!
如果这是你想要的,现在你必须编写类似于 std::copy 的函数,只需将赋值替换为你的域特定处理