为什么线程安全的ACE容器不支持[]操作符

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

    记得当初刚加入游戏服务端这个行业的时候,有一个老手曾经问我,知道stlmap容器和ACEmap容器有什么不同吗?当时的我对于C++多线程还有很多的不解和迷惑、便摇摇头说不知道,他告诉我说,ACEmap容器是线程安全的,而stlmap容器则不是。当时的我蒙蒙东东,等到真正自己在使用stlmap,由于跨线程造成coredump时,才真正理解了线程安全和线程不安全的区别。

   越到后来越想自己也封装一个线程安全的stl库,在封装的过程中遇见了下面的问题。比如我们小范围的封装一下stl的vector库:


class vectorEx
{
public:
    vectorEx()
    {
        data.resize(100);
    }
    int& operator[](const size_t x)
    {
        if(x < 0)
        {
            return data[0];
        }
        cout << "const has been called" << endl;
        return data[x];
    }
    int insert(int index,int value)
    {
        if(index < 0)
        {
            return -1;
        }
        this->mutex_lock();
        data[index] = value;
        this->mutex_unlock();
        return 0;
    }
    int size() const
    {
        return data.size();
    }
    int capacity() const
    {
        return data.capacity();
    }
    vector<int>::const_iterator begin()const
    {
        return data.begin();
    }
    vector<int>::const_iterator end()const
    {
        return data.end();
    }

    int mutex_lock()
    {
        return pthread_mutex_lock(&this->_self_mutex);
    }
    int mutex_unlock()
    {
        return pthread_mutex_unlock(&this->_self_mutex);
    }
private:
    vector<int> data;
    pthread_mutex_t _self_mutex;

};

 对于[]操作符我们是无法加锁解锁的,所以我想ACE的大师们,使用了bind()函数去封装。


int bind(const size_t index,int value)
    {
        if(index < 0)
        {
            return -1;
        }
        this->mutex_lock();
        data[index] = value;
        this->mutex_unlock();
        return 0;
    }

 于insert函数类似,当然我没有使用模板,对于模板还是不太熟悉。


相关文章
|
9天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
15 1
|
6月前
|
存储 安全 Java
【JavaSE专栏50】Java集合类Vector解析,一款线程安全的动态数组容器
【JavaSE专栏50】Java集合类Vector解析,一款线程安全的动态数组容器
|
11月前
|
安全 容器
并发编程-14线程安全策略之并发容器(J.U.C)中的集合类
并发编程-14线程安全策略之并发容器(J.U.C)中的集合类
65 0
|
11月前
|
安全 Java 容器
并发编程-13线程安全策略之两种类型的同步容器
并发编程-13线程安全策略之两种类型的同步容器
61 0
|
11月前
|
安全 Java 大数据
大数据开发基础的编程语言的Java的并发/多线程编程的并发容器
在Java并发编程中,使用并发容器可以提高多线程环境下的数据访问效率和安全性。本文将介绍Java的并发容器以及如何使用它们进行多线程编程。
79 0
|
安全 Java 容器
Java并发编程 - 线程不安全类 & 同步/并发容器之简介
Java并发编程 - 线程不安全类 & 同步/并发容器之简介
91 0
Java并发编程 - 线程不安全类 & 同步/并发容器之简介
|
存储 安全 NoSQL
C++ STL容器如何解决线程安全的问题?
众所周知,STL容器不是线程安全的。对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了core dump。另外一种情况,如果是多个写方,并发的push_back(),也会导致core dump。
1188 0
|
存储 监控 安全
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
90 0
如何保证容器是线程安全的? ConcurrentHashMap 如何高效的线程安全?
|
存储 安全 Java
多线程六 同步容器&并发容器
多线程六 同步容器&并发容器
108 0
|
存储 安全 Java
Java 中的线程安全容器
常用的一些容器例如 ArrayList、HashMap、都不是线程安全的,最简单的将这些容器变为线程安全的方式,是给这些容器所有的方法都加上 synchronized 关键字。
501 0
Java 中的线程安全容器