首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >标准容器作为多线程应用程序中的局部变量

标准容器作为多线程应用程序中的局部变量
EN

Stack Overflow用户
提问于 2012-03-01 10:32:17
回答 4查看 871关注 0票数 12

我知道标准库中的容器并不是线程安全的。在此之前,我一直认为一个容器(比如std::list类型的容器)不能被多个线程并发访问(其中一些线程可能会修改容器)。但现在看来,它有比眼前更多的东西;一些更微妙的东西,一些不那么明显的东西,至少对我来说是这样。

例如,考虑这个函数,它按值接受第一个参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void log(std::string msg, severity s, /*...*/) 
{
   return; //no code!
}

这个线安全吗?

起初,它似乎是线程安全的,因为函数主体没有访问共享的可修改资源,因此线程是安全的。再想一想,当调用这样一个函数时,会创建一个std::string类型的对象,这是第一个参数,我认为这个对象的构造不是线程安全的,因为它内部使用std::allocator,我认为它不是线程安全的。因此,调用这样的函数也不是线程安全的。但如果它是正确的,那么这是怎么说的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void f()
{
   std::string msg = "message"; //is it thread-safe? it doesn't seem so!
}

我走得对吗?我们可以在多线程程序中使用std::string (或任何内部使用std::allocator的容器)吗?

--我专门说的容器是局部变量,而不是共享对象。

我搜索了谷歌,发现了许多类似的疑问,没有具体的答案。我所面对的问题与他的问题相似:

请同时考虑C++03和C++11。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-01 10:41:39

在C++11中,std::allocator是线程安全的。从定义上看:

20.6.9.1/6:备注:通过调用::operator new(std::size_t)获得存储

::operator new的定义

18.6.1.4:operator newoperator delete的库版本、全局operator newoperator delete的用户替换版本以及C标准库函数callocmallocreallocfree不应由于来自不同线程的并发调用而引入数据竞赛(1.10)。

C++03没有线程的概念,所以任何线程安全都是特定于实现的;您必须参考实现的文档来查看它所提供的保证(如果有的话)。由于您使用的是微软的实现,此页说从多个线程写入同一个类的多个容器对象是安全的,这意味着std::allocator是线程安全的。

票数 7
EN

Stack Overflow用户

发布于 2012-03-01 10:50:51

在C++11中,对于默认的分配器,这将在以下文件中得到解决:

20.6.9.1分配程序成员allocator.members 除析构函数外,默认分配程序的成员函数不应由于来自不同线程的对这些成员函数的并发调用而引入数据竞赛(1.10)。对分配或释放某一特定存储单元的这些功能的调用应以单个总顺序进行,而每一次取消分配调用都应发生在此顺序中的下一次分配(如果有的话)之前。

任何用户提供的分配器如果要跨不同的线程使用,都必须保持相同的约束。

当然,对于该标准的早期版本,没有提到这一点,因为他们没有谈到多线程。如果一个实现支持多线程(像许多人或大多数人一样),那么它将负责处理这些问题。类似于实现为C和C++提供线程安全的malloc() (和其他库函数)的方式,尽管之前的标准没有提到这一点。

票数 5
EN

Stack Overflow用户

发布于 2012-03-01 10:52:33

正如你可能已经想到的,不会有一个简单的答案是或不是。不过,我认为这可能有帮助:

6

我逐字引述:

5.6 libstdc++-v3线程安全吗? 当满足以下所有条件时,libstdc++-v3力求实现线程安全: 该系统的libc本身是线程安全的,gcc -v报告了一个线程模型,而不是‘单’的,在3.3之前,只有一个非一般实现为所讨论的体系结构存在一个非一般实现。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9521879

复制
相关文章
C++中类成员函数作为多线程的入口
搜了一圈答案,基本上都是启动线程的时候传入this指针,在线程函数内部再强转的解决方案。可能显得有些别扭。
ApacheCN_飞龙
2019/02/15
2.8K0
标准库容器
forward_list、array是新C++标准增加的类型 与内置数组相比,array是一种更安全、更容易使用的数组类型。 array对象的大小不是固定的,因此,他支持插入和删除元素以及改变容器大小的操作
Cloud-Cloudys
2020/07/07
6940
STL标准库容器
STL对定义的通用容器分三类:顺序性容器、关联式容器和容器适配器。 顺序性容器:vector、deque、list 关联性容器:set、multiset、map、multimap 容器适配器:stack、queue
废江_小江
2022/09/05
2570
STL标准库容器
下篇1:将 ConfigMap 中的键值对作为容器的环境变量
继续接上篇,《一文了解K8S的ConfigMap》。上篇聊过,官方文档中提到的可以使用下面4种方式来使用 ConfigMap 配置 Pod 中的容器:
不背锅运维
2023/05/26
2.2K0
下篇1:将 ConfigMap 中的键值对作为容器的环境变量
媒体容器新标准—CMAF
1. 视频流量持续走高 随着移动互联网的快速发展,数据流量呈现出爆发式的增长,互联网传输的视频流量也呈爆炸性增长,预计未来几年将持续增长。根据2017年思科预测,到2021年,如果要看完全球IP网络上
用户1324186
2018/03/05
7K0
媒体容器新标准—CMAF
多线程之并发容器
使用concurrentHashMap之前先了解一下HashMap,在该文章中会看到HashMap在并发场景下是不安全的。ConcurrentHash(1.8) 为了解决HashMap不安全的问题,采用了CAS+synchronized技术,底层实现也是使用数组+链表+红黑树。
OPice
2019/10/23
5420
如何使用nginx作为docker容器中ASP.NET应用的反向代理
ASP.NET是一个Web开发框架,可以让开发者创建动态的Web应用和服务。ASP.NET的一个优点是它可以运行在不同的平台上,比如Windows,Linux和macOS,使用docker容器。Docker是一个软件工具,可以让开发者将应用打包和部署在隔离的环境中。通过使用docker,ASP.NET应用可以轻松地在任何云或本地基础设施上部署和扩展。使用docker与ASP.NET的一个挑战是如何配置托管应用的Web服务器。一个流行的选择是使用nginx作为ASP.NET应用的反向代理。Nginx是一个高性能的Web服务器,可以处理高并发和负载均衡。通过使用nginx作为反向代理,开发者可以提高他们的ASP.NET应用的安全性,性能和可靠性。要使用nginx作为反向代理,开发者需要配置nginx.conf文件,指定运行在docker容器中的ASP.NET应用的位置和端口。
jackcode
2023/03/30
9760
如何使用nginx作为docker容器中ASP.NET应用的反向代理
Docker容器学习梳理--应用程序容器环境部署
关于国内Docker镜像,可以参考:Docker容器学习梳理--基础知识(2) 的Docker镜像使用。 如果我们需要在Docker环境下部署tomcat、redis、mysql、nginx、php等应用服务环境,有下面三种方法: 1)根据系统镜像创建Docker容器,这时容器就相当于是一个虚拟机,进入容器内部署应用环境。 然后将这种应用容器提交为新的镜像,最后基于这种新的应用镜像创建容器,创建时做好端口映射,就可以在外部访问这些应用了。 2)直接通过docker pull拉取别人提交好的tomcat
洗尽了浮华
2018/01/23
2.4K0
Docker容器学习梳理--应用程序容器环境部署
你的也是我的。3例ko多线程,局部变量透传
java中的threadlocal,是绑定在线程上的。你在一个线程中set的值,在另外一个线程是拿不到的。如果在threadlocal的平行线程中,创建了新的子线程,那么这里面的值是无法传递、共享的(先想清楚为什么再往下看)。这就是透传问题。
田维常
2019/08/21
7880
你的也是我的。3例ko多线程,局部变量透传
"Docker 容器命令:解析容器化应用程序的运行时"
镜像是在docker中的,应用是在一个镜像中的,如何在容器中运行一个程序,如果直接使用docker访问是不行的,因为此时的应用只是在某个镜像下启动了,相当于在docker内部,而不是docker本身,此时就需要将镜像中的应用程序的启动端口映射给docker,在docker访问映射端口的时候跳转到容器中启动的程序。
Java学术趴
2023/06/29
3530
"Docker 容器命令:解析容器化应用程序的运行时"
电子合同作为电子证据的司法认定标准
互联网技术实现人们以更便捷的方式进行信息传递、生产交易。但是,随着生产、生活逐渐互联网化,基于网络平台的行为产生纠纷时,以电子数据为主要表现形式的证据证明过程成为难题。
契约锁电子合同
2019/09/24
5.9K0
电子合同作为电子证据的司法认定标准
Nexus作为容器注册表的配置指南
在过去的十年中,开发人员经历了打包和部署应用程序和底层操作系统的方式的转变。Docker容器和最流行的开源容器编排系统Kubernetes(K8)的使用率上升,已经改变了软件供应链。一方面,开发,测试和生产团队可以获得将代码及其所有依赖性打包到容器中的优势。另一方面,随着每一项新技术的产生,出现了新的包装管理系统的复杂性。
DevOps云学堂
2020/09/30
1.7K1
Nexus作为容器注册表的配置指南
boost::assign(标准容器填充库)
boost::assign通过对"+="和","的重载非常方便的填充标准容器(std::vector,std::set,std::list,std::map),使用boost::assign需要#include<boost/assign.hpp>
racaljk
2019/02/25
1.3K0
什么是标准容器(2021 版)
有很多方法可以创建容器,尤其是在 Linux 等上。除了超级广泛的 Docker 实现,您可能听说过 LXC、systemd-nspawn,甚至 OpenVZ。
用户5166556
2023/03/18
7500
什么是标准容器(2021 版)
sql中declare的用法_sql局部变量
换工作了,以后主要和SqlServer打交道了,仿佛回到了大学,不知道学校的饭还是那么好吃又便宜吗?北京的饭好贵;不知道门口那家板面的生意是不是还是那么红火,好想再去吃一碗。。。
全栈程序员站长
2022/09/24
1.8K0
sql中declare的用法_sql局部变量
使用容器进行应用程序路由
本文收录在DZone的容器编制与部署指南中。点击此处阅读更多富有洞察力的文章、行业统计数据等内容!
Techeek
2018/01/15
9170
Go 应用程序设计标准
众所周知 Go 语言官方成员 Russ Cox 曾向 Go 社区回应并没有 Go 应用程序设计标准。但是,为什么本文还要使用这个标题呢?
frank.
2022/05/17
2180
vapor 切换MySQL作为Cache存储容器
之前做了将SQLite作为Cache的说明,现在由于把数据全部迁移到MySQL存储因此需要把Cache也转移到MySQL作为存储媒介,由于官方没有很好的实例于仿照SQLite的流程来梳理一遍:
大话swift
2019/07/04
6320
vapor 切换MySQL作为Cache存储容器
轻松容器化golang应用程序
首先,您需要使用systemctl start docker或启动您的 docker 守护进程service docker start,如果需要必要权限请使用sudo。
用户5166556
2023/03/18
4730
轻松容器化golang应用程序
C++中自定义结构体或类作为关联容器的键
STL中像set和map这样的容器是通过红黑树来实现的,插入到容器中的对象是顺序存放的,采用这样的方式是非常便于查找的,查找效率能够达到O(log n)。所以如果有查找数据的需求,可以采用set或者map。
charlee44
2020/03/19
2.2K0

相似问题

标准Python基类作为任意属性的容器

13

OpenMP、多线程BFS、ptr到C数组作为局部变量

115

在多线程环境中将局部变量作为const引用传递

14

使用局部变量值作为查询标准SQL Server

12

多线程GAE应用程序的请求分派标准

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文