实现线程安全数组

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();
    }
};

谷歌搜索“无锁数据结构”。 - PlasmaHH
1
你进行了性能分析吗?你怎么知道性能不好?对于你所尝试做的事情而言,它可能已经足够好了 - 其他选择可能对你真正需要做的事情来说过于复杂!?! - Nim
3
请注意:这段代码不具备异常安全性,例如当索引无效时会发生死锁。你应该使用一些作用域锁系统。 - KillianDS
1
@KillianDS:如果索引无效(我假设您是指“修改”),它不会死锁,而是导致未定义的行为,这更糟糕,但在一般情况下,没有任何操作会抛出异常(唯一可能抛出异常的操作是push_back,如果它无法分配新的内存块)。仍然建议非常明智:始终使用RAII来持有资源,而锁是一种资源 - David Rodríguez - dribeas
@Nim:这段代码是我正在做的简化版本,必须具有可扩展性。Serge Dundich 给了我一些解决问题的线索(见下文)。无论如何,还是谢谢你! :) - anhldbk
显示剩余3条评论
2个回答

1

0

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接