通过多个线程访问向量?

Posted

技术标签:

【中文标题】通过多个线程访问向量?【英文标题】:Accessing vector over multiple threads? 【发布时间】:2013-01-08 09:20:21 【问题描述】:

如何保护向量 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);
    

【问题讨论】:

一个mutex? 可能重复:***.com/questions/12260946/… 只是补充其他人所说的,如果您只是从多个线程读取向量的内容,它是线程安全的。 【参考方案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;

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于通过多个线程访问向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何安全地从多个线程并行访问和写入复杂容器?

C++:在多个线程中访问同一数组/向量的不同单元是不是会产生数据竞争?

通过线程使用向量单元

Java中向量的同步

java通过snmp多线程并发访问设备获取数据

通过引用向量传递的线程函数启动缓慢