4

我想实现一个类似数组的数据结构,允许多个线程同时修改/插入项目。我如何才能获得它的性能?我围绕 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();
    }
};
4

2 回答 2

1

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

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

于 2011-09-26T12:19:41.623 回答
0

最好的方法是使用一些快速的读写锁。您对只读访问执行共享锁定,对可写访问执行排他锁定 - 这样只读访问是同时执行的。

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

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

于 2011-09-26T10:12:18.390 回答