实现线程安全数组
我想实现一个类似数组的数据结构,允许多个线程同时修改/插入项目。我怎样才能获得它的性能?我围绕 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();
}
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
看一下 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
最好的方法是使用一些快速的读写器锁。您对只读访问执行共享锁定,对可写访问执行独占锁定 - 这样只读访问是同时执行的。
在用户模式 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.