zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

安全容器线程 支持 为什么 操作符 ACE
2023-09-14 08:57:59 时间

    记得当初刚加入游戏服务端这个行业的时候,有一个老手曾经问我,知道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函数类似,当然我没有使用模板,对于模板还是不太熟悉。



C++ STL容器如何解决线程安全的问题? 众所周知,STL容器不是线程安全的。对于vector,即使写方(生产者)是单线程写入,但是并发读的时候,由于潜在的内存重新申请和对象复制问题,会导致读方(消费者)的迭代器失效。实际表现也就是招致了core dump。另外一种情况,如果是多个写方,并发的push_back(),也会导致core dump。
Java 中的线程安全容器 常用的一些容器例如 ArrayList、HashMap、都不是线程安全的,最简单的将这些容器变为线程安全的方式,是给这些容器所有的方法都加上 synchronized 关键字。
一、为什么会出现同步容器? 在Java的集合容器框架中,主要有四大类别:List、Set、Queue、Map。 List、Set、Queue接口分别继承了Collection接口,Map本身是一个接口。
Java ,单实例 多线程 ,web容器,servlet与struts1-2.x系列,线程安全的解决 1.Servlet是如何处理多个请求同时访问呢? 回答:servlet是默认采用单实例,多线程的方式进行。只要webapp被发布到web容器中的时候,servlet只会在发布的时候实例化一次,servlet在其生命周期中只有在将项目给移除或服务器stop的时候才会销毁,那么一个web项目从发布到运行只存在一个servlet的实例。
Docker的容器管理 docker run 等于创建+启动 docker run 镜像名,如果镜像不存在本地,则会在线去下载该镜像。 注意:容器内的进程必须处于前台运行状态,否则容器就会直接退出,自己部署一个容器运行,命令不得后台运行,前台运行即可。 如果容器内,什么事也没做,容器也会挂掉。容器内,必须有一个进程在前台运行。 我们运行nginx基础镜像,没有运行任何程序,因此容器直接挂掉 docker run nginx
容器技术-Docker的优点 当产品运行在内部的虚拟化平台中,如openstack,也就是KVM虚拟化,创建虚拟机,但是不断增加的云端应用,增加了对硬件资源的消耗,不断的创建虚拟机,消耗了大量的硬件资源。 那么如何高效的利用硬件资源实现云服务呢