首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

stl的queue到底是不是线程安全的?该如何解决

2012-02-17 
stl的queue到底是不是线程安全的?在网上看到不少人说stl容器不是线程安全的,谁能举个例子?我有个需求是两

stl的queue到底是不是线程安全的?
在网上看到不少人说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;
intm_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;
}

[解决办法]
你这个是多线程?
[解决办法]
C++ standard中没有规定STL容器必须是线程安全的。也就是说STL的实现者可以自己决定是否在STL中支持线程安全。

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

To:OnlyHappy(说好不打脸)
楼主使用的ACE来实现多线程任务,所以没有明显的调用线程控制API.
[解决办法]
用多核的平台测试看看

[解决办法]
肯定要你自己同步啊。。。要不就用ACE_Message_Queue
[解决办法]
并发问题不是那么容易复现的。
几十万次运行出一次也算蛮高的频率了。

热点排行