stl::map和stl::vetctor线程安全解决方案

forster 2009-11-20 07:21:22
再多线程下处理同一map和vector
读是否线程安全?
除了在写操作前后cirticalsection之外有无成熟简易的解决方案?
...全文
2983 21 打赏 收藏 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
永远的风筝 2011-09-01
  • 打赏
  • 举报
回复
3楼回答的第一部分已经足够了啊
love514425 2009-11-20
  • 打赏
  • 举报
回复
> 学习.
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 cattycat 的回复:]
还是用window提供的加锁机制吧,Mutex,Semaphore或CRITICAL_SECTION 。
用这些实现类似读写锁机制性能上比较好。
[/Quote]
CRITICAL_SECTION是最快的。
其他内核锁(事件、互斥体),每进一次内核,都需要上千个CPU周期。
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 forster 的回复:]
成员函数做默认参数需要静态,,
改成静态又链接错误了。。。
Error 4 error LNK2001: unresolved external symbol "public: static class CriticalSection CSocketServer::m_cs" (?m_cs@CServer@@2VCriticalSection@@A) Server.obj

[/Quote]
静态成员需要在类定义的外面声明的,比如:

CriticalSection CSocketServer::m_cs;
cattycat 2009-11-20
  • 打赏
  • 举报
回复
还是用window提供的加锁机制吧,Mutex,Semaphore或CRITICAL_SECTION 。
用这些实现类似读写锁机制性能上比较好。
wangxipu 2009-11-20
  • 打赏
  • 举报
回复
线程安全需要用户负责,否则STL也管的太多了些……

其实完全可以将STL 容器包装一个类,此类继承一个如上的CS同步类或对象
forster 2009-11-20
  • 打赏
  • 举报
回复
成员函数做默认参数需要静态,,
改成静态又链接错误了。。。
Error 4 error LNK2001: unresolved external symbol "public: static class CriticalSection CSocketServer::m_cs" (?m_cs@CServer@@2VCriticalSection@@A) Server.obj
forster 2009-11-20
  • 打赏
  • 举报
回复
函数巨多打算打算声明成fuc(..,Locker l = Locker(m_cs));看看效果
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
另外,加锁的代价是比较大的。
所以要设计好代码。
不要频繁的加锁。
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 forster 的回复:]
引用 8 楼 loaden 的回复:
我给的示例代码,可以不使用全局的静态变量,改用普通的成员变量。
我那个类因为是全局类静态类,所以才使用了静态变量。
C/C++ codestatic std::set <constvoid*> g_objPtr;static CriticalSection g_cs;


用起来还是比较方便,我在想怎么把所有的函数都加上。。
[/Quote]
建议针对每个容器实例用一个锁。
以免出现奇怪的死锁现象。
forster 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 loaden 的回复:]
我给的示例代码,可以不使用全局的静态变量,改用普通的成员变量。
我那个类因为是全局类静态类,所以才使用了静态变量。
C/C++ codestatic std::set<constvoid*> g_objPtr;static CriticalSection g_cs;
[/Quote]

用起来还是比较方便,我在想怎么把所有的函数都加上。。
thinkboy234 2009-11-20
  • 打赏
  • 举报
回复
学习。。。
winnuke 2009-11-20
  • 打赏
  • 举报
回复
线程安全是指针对某些类的方法的调用的吧。
你若是多个线程读写一个vector对象,那叫线程同步问题。
crt里有些函数以前是线程不安全的,因为其实现依赖了一些静态和全局变量。但是只是说这个函数线程不安全。如果说一个类线程不安全应该是指单独的线程内使用单独的该类的对象是否安全吧?
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
我给的示例代码,可以不使用全局的静态变量,改用普通的成员变量。
我那个类因为是全局类静态类,所以才使用了静态变量。
static std::set<const void*> g_objPtr;
static CriticalSection g_cs;
jackyjkchen 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 forster 的回复:]
比如map是不是读写都要加锁?
[/Quote]
如果你要兼容老的STL,干脆全加上,因为STL对于多线程没有提要求。
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 forster 的回复:]
比如map是不是读写都要加锁?
[/Quote]
是的。
bool EvtObjMgr::IsExist(const void* objPtr)
{
Locker lock(g_cs);
return g_objPtr.find(objPtr) != g_objPtr.end();
}
forster 2009-11-20
  • 打赏
  • 举报
回复
比如map是不是读写都要加锁?
do_fork 2009-11-20
  • 打赏
  • 举报
回复
针对同一对象的访问,只要有写操作,几乎都不是线程安全的
「已注销」 2009-11-20
  • 打赏
  • 举报
回复
不安全。加个临界区检测。
class CriticalSection
{
public:
CriticalSection() { ::InitializeCriticalSection(&m_cs); }
virtual ~CriticalSection() { ::DeleteCriticalSection(&m_cs); }
void Lock() { ::EnterCriticalSection(&m_cs); }
void Unlock() { ::LeaveCriticalSection(&m_cs); }
operator PCRITICAL_SECTION() { return &m_cs; }

protected:
CRITICAL_SECTION m_cs;
};

class Locker
{
public:
Locker(PCRITICAL_SECTION cs) : m_p(cs) { ::EnterCriticalSection(m_p); }
~Locker() { ::LeaveCriticalSection(m_p); }

protected:
PCRITICAL_SECTION m_p;
};


使用时:
// 维护需要处理消息的所有对象指针,只有指针存在,才能发送消息
static std::set<const void*> g_objPtr;
static CriticalSection g_cs;

void EvtObjMgr::Add(const void* objPtr)
{
Locker lock(g_cs);
g_objPtr.insert(objPtr);
}

void EvtObjMgr::Remove(const void* objPtr)
{
Locker lock(g_cs);
g_objPtr.erase(objPtr);
}
lsldd 2009-11-20
  • 打赏
  • 举报
回复
map本身含有静态变量,在多线程下使用一定要加锁。
CirticalSection已经是最简单的互斥了。。。不知道还有什么更简单的解决方案。。。
加载更多回复(1)
内容概要:本文围绕基于电感电容电流环PI与前馈补偿矩阵构造的跟网型储能变流器,开展dq坐标系下的阻抗理论建模与Simulink仿真对比研究。通过建立储能变流器在dq域的数学模型,设计包含电感电流内环、电容电流中间环和电压外环的多环控制结构,并引入前馈补偿矩阵以提升系统的动态响应能力和稳定性。在此基础上,采用小信号分析法推导系统的输出阻抗模型,构建完整的dq域阻抗理论框架,并利用Simulink平台搭建高保真仿真模型进行频域扫频验证,实现理论建模与仿真结果的精确对比,深入分析控制参数对系统阻抗特性的影响规律,揭示其在抑制并网系统振荡、提升稳定性方面的关键作用,为新能源并网系统的稳定性分析与优化设计提供坚实的理论支撑和技术路径。; 适合人群:具备电力电子、自动控制理论基础,从事新能源发电、储能系统、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握跟网型储能变流器在dq域的阻抗建模方法;②理解多环控制与前馈补偿对系统阻抗特性的影响机制;③实现理论阻抗模型与Simulink仿真扫频结果的对比验证,支撑并网稳定性分析。; 阅读建议:学习者应结合控制理论与电力电子变换器知识,重点关注数学推导与仿真建模的一致性,建议动手复现Simulink仿真模型并进行参数敏感性分析,以深化对阻抗重塑机理的理解。
内容概要:本文介绍了基于Matlab实现的基本雷达与干扰机仿真系统,旨在通过代码实践帮助读者深入理解雷达系统的工作原理及其在复杂电磁环境中与干扰机的相互作用机制。内容涵盖雷达信号的发射、传播、目标回波接收、微多普勒效应建模、干扰信号的生成与影响分析等关键环节,结合具体的Matlab代码实现了完整的仿真流程,并提供了详尽的结果可视化与性能评估,重点展示了目标探测、时频特征提取、干扰抑制策略等关键技术的实现方法,有助于掌握雷达系统动态特性与抗干扰能力的分析手段。; 适合人群:具备一定Matlab编程基础,对雷达系统、信号处理、电子对抗或通信工程等领域感兴趣的高校学生、科研人员及工程技术人员。; 使用场景及目标:①学习雷达系统的基本构成与工作流程;②掌握雷达回波信号与典型干扰信号(如噪声干扰、欺骗干扰)的数学建模方法;③通过Matlab仿真深入理解微多普勒特征、时频分析技术(如STFT、小波变换)及干扰抑制算法;④为开展雷达目标识别、抗干扰算法设计或电子战系统仿真等前沿研究奠定实践基础。; 阅读建议:建议读者结合提供的Matlab代码逐段运行并调试,重点关注雷达信号模型、目标运动建模、干扰生成模块及信号处理流程,配合文中仿真结果进行对比分析;同时可延伸学习现代信号处理技术如压缩感知、机器学习在雷达中的应用,以提升综合科研与工程实践能力。

65,214

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧