stl的queue到底是不是线程安全的?

JQ123 2007-05-15 11:27:00
在网上看到不少人说stl容器不是线程安全的,谁能举个例子?我有个需求是两个线程对一个queue同时进行读写操作,我写下面的代码测试了一下没有问题呀?
#include "ace/Task.h"
#include <queue>
#include <iostream>
#include <assert.h>
#include <ace/OS.h>

using namespace std;

queue<int> g_Queue;
bool g_bEnd = false;
bool g_bEnd2 = false;
ACE_Time_Value t(0);

class Consumer : public ACE_Task_Base
{
public:
Consumer()
{
//this->m_Queue = q;
}
int svc()
{
int last = -1;
t.usec(100);
while(!g_bEnd)
{
while(!g_Queue.empty())
{
assert(g_Queue.front() == last + 1);
cout<<"Dequeue:"<<g_Queue.front()<<endl;
last = g_Queue.front();
g_Queue.pop();
}
ACE_OS::sleep(t);
}
g_bEnd2 = true;
return 0;
}
protected:
//queue<int> *m_Queue;
private:
};

class Producer : public ACE_Task_Base
{
public:
Producer(int nCount)
{
//this->m_Queue = q;
this->m_nCount = nCount;
}
int svc()
{
int last = -1;
t.usec(100);
for (int i = 0; i < this->m_nCount; ++i)
{
assert(i == last + 1);
TRACE("Enqueue:%d\n", i);
g_Queue.push(i);
last = i;
ACE_OS::sleep(t);
}
g_bEnd = true;
return 0;
}
protected:
//queue<int> *m_Queue;
int m_nCount;
private:
};

int main(int, ACE_TCHAR *[])
{
Consumer tc;
Producer tp(9999);
tc.activate();
tp.activate();

while (!g_bEnd2 || !g_bEnd)
{
ACE_OS::sleep(1);
}
return 0;
}
...全文
1459 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
OnlyHappy 2007-05-15
  • 打赏
  • 举报
回复
TO: Polarislee(北极星)(无房无车,飘在北京) :
Soryy.没有注意到前面有个ACE.太粗心了。。面壁去
roger_77 2007-05-15
  • 打赏
  • 举报
回复
用多核的平台测试看看
北极猩猩 2007-05-15
  • 打赏
  • 举报
回复
C++ standard中没有规定STL容器必须是线程安全的。也就是说STL的实现者可以自己决定是否在STL中支持线程安全。

因此现在流行的STL中很多不是线程安全的,也有些是线程安全的。需要自己根据所使用的STL的版本来进行判断。

To:OnlyHappy(说好不打脸)
楼主使用的ACE来实现多线程任务,所以没有明显的调用线程控制API.
OnlyHappy 2007-05-15
  • 打赏
  • 举报
回复
你这个是多线程?
taodm 2007-05-15
  • 打赏
  • 举报
回复
并发问题不是那么容易复现的。
几十万次运行出一次也算蛮高的频率了。
JQ123 2007-05-15
  • 打赏
  • 举报
回复
我知道stl不是线程安全了,可有人能说说我这个模型为啥没出错呢?其实我只要我这个需求的模型是"线程安全"的就行了
foochow 2007-05-15
  • 打赏
  • 举报
回复
肯定要你自己同步啊。。。要不就用ACE_Message_Queue
taodm 2007-05-15
  • 打赏
  • 举报
回复
打开源码看一下就知道了。
基本上没有线程安全的STL库被实际投入使用。
VS2005的实现从代码看,肯定是非线程安全的。
JQ123 2007-05-15
  • 打赏
  • 举报
回复
哦,原来是依赖实现的么。我现在有vs2005,用这个测试没问题。不知道在linux/unix下也对啊?

64,647

社区成员

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

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