使用 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 的函数,只需将赋值替换为你的域特定处理

http://www.cplusplus.com/reference/algorithm/copy/