实现线程安全数组

发布于 2024-12-06 15:31:34 字数 600 浏览 3 评论 0 原文

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

I want to implement a array-liked data structure allowing multiple threads to modify/insert items simultaneously. How can I obtain it in regard to performance? I implemented a wrapper class around std::vector and I used critical sections for synchronizing threads. Please have a look at my code below. Each time a thread want to work on the internal data, it may have to wait for other threads. Hence, I think its performance is NOT good. :( Is there any idea?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

那小子欠揍 2024-12-13 15:31:34

看一下 Boost 库中的shared_mutex。这允许您拥有多个读取器,但只有一个写入器

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

Take a look at shared_mutex in the Boost library. This allows you to have multiple readers, but only one writer

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

欲拥i 2024-12-13 15:31:34

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

在用户模式 ​​Win32 API 中有 Slim Reader/写入器 (SRW) 锁在 Vista 及更高版本中可用。

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

The best way is to use some fast reader-writer lock. You perform shared locking for read-only access and exclusive locking for writable access - this way read-only access is performed simultaneously.

In user-mode Win32 API there are Slim Reader/Writer (SRW) Locks available in Vista and later.

Before Vista you have to implement reader-writer lock functionality yourself that is pretty simple task. You can do it with one critical section, one event and one enum/int value. Though good implementation would require more effort - I would use hand-crafted linked list of local (stack allocated) structures to implement fair waiting queue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文