通过多个线程访问向量?

时间:2013-01-08 09:20:21

标签: c++ multithreading mutex

如何保护矢量v不会崩溃?还有一个问题,为什么不是它已经崩溃了,不应该吗?

#include <Windows.h>
#include <thread>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<int> v;

void a()
{
    while (true)
    {
        v.push_back(1);
        Sleep(100);
    }
}

void b()
{
    while (true)
    {
        if (!v.empty())
        {
            v.erase(v.begin());
        }
        Sleep(100);
    }
}

void c()
{
    while (true)
    {
        v.push_back(1);

        Sleep(100);
    }
}

int main()
{
    thread(&a).detach();
    thread(&b).detach();
    thread(&c).detach();

    while (true)
    {

        for (int i = 0; i < v.size(); i++)
        {
            v[i]++;
        }


        cout << v.size() << endl;


        if (!v.empty())
            v.erase(v.begin());

        Sleep(100);
    }
}

2 个答案:

答案 0 :(得分:1)

要从多个线程访问一个向量,需要添加std :: mutex,惯用方法是实现RAII,见下面的演示代码:

#include <mutex>
#include <thread>

class raii_vector
{
public:
  raii_vector() {  }
  void Add() 
  { 
    std::lock_guard<std::mutex> lock(m_);
    v_.push_back(1);
  }

  void Remove() 
  { 
    std::lock_guard<std::mutex> lock(m_);
    if (!v_.empty())
    {
        v_.erase(v_.begin());
    }
  }

private:
  std::mutex       m_;
  std::vector<int> v_;
};

raii_vector rv;

void a()
{
  while (true)
  {
    rv.Add();
    std::cout << "adding " << std::endl;
    std::chrono::milliseconds dura( 100 );
    std::this_thread::sleep_for( dura );
  }
}

void b()
{
  while (true)
  {
    std::cout << "removing " << std::endl;
    rv.Remove();
    std::chrono::milliseconds dura( 100 );
    std::this_thread::sleep_for( dura );
  }
}

int main(int argc, char* argv[])
{
  std::thread t1(a);
  std::thread t2(b);

  t1.join();
  t2.join();

  return 0;
}

答案 1 :(得分:0)

当想要使用多个线程的向量等数据结构时,我发现Intel Threading Building Blocks library非常有用。