为什么线程安全的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函数类似,当然我没有使用模板,对于模板还是不太熟悉。


相关文章
|
1月前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
34 1
|
2月前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
3月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
【10月更文挑战第14天】多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。
|
3月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。 #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;stdlib.h&gt; //sleep using namespace std; void t1() //普通的函数,用来执行线程 { for (int i = 0; i &lt; 10; ++i)
多线程;顺序容器;智能指针
|
4月前
|
传感器 数据处理 定位技术
多线程;顺序容器;智能指针
多线程的创建创建线程比较简单,C++提供头文件thread,使用std的thread实例化一个线程对象创建。 std::thread 在 #include 头文件中声明,因此使用 std::thread 时需要包含 #include 头文件。 #include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;stdlib.h&gt; //sleep using namespace std; void t1() //普通的函数,用来执行线程 { for (int i = 0; i &lt; 10; ++i)
|
5月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
7月前
|
安全 Java 大数据
Java性能优化(七)-多线程调优-并发容器的使用
Java性能优化(七)-多线程调优-并发容器的使用
63 0
|
8月前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
79 1
|
8月前
|
存储 安全 算法
java多线程之并发容器集合
java多线程之并发容器集合
|
存储 安全 Java
【JavaSE专栏50】Java集合类Vector解析,一款线程安全的动态数组容器
【JavaSE专栏50】Java集合类Vector解析,一款线程安全的动态数组容器
100 0