实现线程安全的数组

时间:2011-09-26 09:49:10

标签: c++ arrays insert synchronize

我想实现一个类似数组的数据结构,允许多个线程同时修改/插入项目。我怎样才能在性能方面获得它?我在std :: vector周围实现了一个包装类,我使用了关键部分来同步线程。请看下面的代码。每次线程想要处理内部数据时,它可能必须等待其他线程。因此,我认为它的表现并不好。 :(有什么想法吗?

class parallelArray{
private:
    std::vector<int> data;
    zLock dataLock; // my predefined class for synchronizing
public:
    void insert(int val){
         dataLock.lock();
         data.push_back(val);
         dataLock.unlock();
    }

    void modify(unsigned int index, int newVal){
         dataLock.lock();
         data[index]=newVal; // assuming that the index is valid
         dataLock.unlock();
    }
};

2 个答案:

答案 0 :(得分:1)

查看Boost库中的shared_mutex。这允许您拥有多个读者,但只有一个作者

http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.shared_mutex

答案 1 :(得分:0)

最好的方法是使用一些快速reader-writer lock。您执行只读访问的共享锁定和可写访问的独占锁定 - 这样就可以同时执行只读访问。

在用户模式的Win32 API中,Vista和更高版本中提供了Slim Reader/Writer (SRW) Locks

在Vista之前,你必须自己实现读写器锁定功能,这是一项非常简单的任务。您可以使用一个临界区,一个事件和一个枚举/ int值来完成。虽然良好的实现需要更多的努力 - 我会使用手工制作的本地(堆栈分配)结构的链表来实现公平的等待队列。