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
[解决办法]
并发问题不是那么容易复现的。
几十万次运行出一次也算蛮高的频率了。