从 boost lock free spsc 队列中得到错误的输出
Getting wrong output from boost lock free spsc queue
我正在尝试使用 boost 库实现用户定义数据类型的无锁队列,但我得到了错误的结果。
请大家帮我看看哪里做错了
#include <boost/lockfree/spsc_queue.hpp>
#include <thread>
#include <iostream>
#include <string.h>
#include <time.h>
class Queue
{
private:
unsigned char *m_data;
int m_len;
public:
Queue(unsigned char *data,int len);
Queue(const Queue &obj);
~Queue();
Queue & operator =(const Queue &obj);
unsigned char *getdata()
{
return m_data;
}
int getint()
{
return m_len;
}
};
Queue::Queue(unsigned char* data, int len)
{
m_len=len;
m_data=new unsigned char[m_len];
memcpy(m_data,data,m_len);
}
Queue::Queue(const Queue& obj)
{
m_len= obj.m_len;
m_data=new unsigned char[m_len];
memcpy(m_data,(unsigned char *)obj.m_data,m_len);
}
Queue::~Queue()
{
delete[] m_data;
m_len=0;
}
Queue & Queue::operator =(const Queue &obj)
{
if(this != &obj)
{
m_len=obj.m_len;
m_data=new unsigned char[m_len];
memcpy(m_data,(unsigned char *)obj.m_data,m_len);
}
return *this;
}
boost::lockfree::spsc_queue<Queue*> q(10);
void produce()
{
int i=0;
unsigned char* data=(unsigned char *)malloc(10);
memset(data,1,9);
Queue obj(data,10);
Queue *pqueue=&obj;
printf("%d\n",pqueue->getint());
q.push(pqueue);
}
void consume()
{
Queue *obj;
q.pop(&obj);
printf("%d\n",obj->getint());
}
int main(int argc, char** argv) {
// std::thread t1{produce};
// std::thread t2{consume};
//
// t1.join();
// t2.join();
produce();
consume();
return 0;
}
根据 boost::lockfree::queue 要求,我在 class 中创建了以下内容。
- 复制构造函数
- 赋值运算符
- 析构函数
如果还有其他需要,请告诉我。
谢谢。
您正在使用 C++ 中的 malloc
。
你死定了。
You have 2 lives left.
说真的,不要那样做。特别是因为将它与 delete[]
一起使用是明确的 Undefined Behaviour.
可悲的是你在这里又失去了一条生命:
Queue obj(data,10);
Queue *pqueue=&obj;
q.push(pqueue);
您存储 指向本地 的指针。更多Undefined Behaviour
You have 1 life left.
上次生活在
q.pop(&obj);
你使用迭代器弹出。它将被视为输出迭代器。
你得到一个 return 表示弹出的元素数量和项目
将写入 &obj[0]
、&obj[1]
、&obj[2]
等
你猜怎么着? Undefined Behaviour.
另请参阅:
You died.
你已经死了。但是你放弃了你的来世
printf("%d\n",obj->getint());
因为 pop
可能没有弹出任何东西(队列可能是空的),这本身就是 Undefined Behaviour.
有趣的是,您谈论所有这些构造函数要求但是您将指针存储在无锁队列中...?!随便写:
typedef std::vector<unsigned char> Data;
class Queue {
private:
Data m_data;
public:
Queue(Data data) : m_data(std::move(data)) {}
Queue() : m_data() {}
unsigned char const *getdata() const { return m_data.data(); }
size_t getint() const { return m_data.size(); }
};
boost::lockfree::spsc_queue<Queue> q(10);
备注:
你需要让消费者检查pop
的return代码。推送可能没有发生,并且无锁队列不会阻塞。
你不需要那个装置。一路传递向量即可:
C++ 代码
#include <boost/lockfree/spsc_queue.hpp>
#include <thread>
#include <iostream>
#include <vector>
typedef std::vector<unsigned char> Queue;
boost::lockfree::spsc_queue<Queue> q(10);
void produce() {
Queue obj(10, 1);
std::cout << __FUNCTION__ << " - " << obj.size() << "\n";
q.push(std::move(obj));
}
void consume() {
Queue obj;
while (!q.pop(obj)) { }
std::cout << __FUNCTION__ << " - " << obj.size() << "\n";
}
int main() {
std::thread t1 {produce};
std::thread t2 {consume};
t1.join();
t2.join();
}
我正在尝试使用 boost 库实现用户定义数据类型的无锁队列,但我得到了错误的结果。
请大家帮我看看哪里做错了
#include <boost/lockfree/spsc_queue.hpp>
#include <thread>
#include <iostream>
#include <string.h>
#include <time.h>
class Queue
{
private:
unsigned char *m_data;
int m_len;
public:
Queue(unsigned char *data,int len);
Queue(const Queue &obj);
~Queue();
Queue & operator =(const Queue &obj);
unsigned char *getdata()
{
return m_data;
}
int getint()
{
return m_len;
}
};
Queue::Queue(unsigned char* data, int len)
{
m_len=len;
m_data=new unsigned char[m_len];
memcpy(m_data,data,m_len);
}
Queue::Queue(const Queue& obj)
{
m_len= obj.m_len;
m_data=new unsigned char[m_len];
memcpy(m_data,(unsigned char *)obj.m_data,m_len);
}
Queue::~Queue()
{
delete[] m_data;
m_len=0;
}
Queue & Queue::operator =(const Queue &obj)
{
if(this != &obj)
{
m_len=obj.m_len;
m_data=new unsigned char[m_len];
memcpy(m_data,(unsigned char *)obj.m_data,m_len);
}
return *this;
}
boost::lockfree::spsc_queue<Queue*> q(10);
void produce()
{
int i=0;
unsigned char* data=(unsigned char *)malloc(10);
memset(data,1,9);
Queue obj(data,10);
Queue *pqueue=&obj;
printf("%d\n",pqueue->getint());
q.push(pqueue);
}
void consume()
{
Queue *obj;
q.pop(&obj);
printf("%d\n",obj->getint());
}
int main(int argc, char** argv) {
// std::thread t1{produce};
// std::thread t2{consume};
//
// t1.join();
// t2.join();
produce();
consume();
return 0;
}
根据 boost::lockfree::queue 要求,我在 class 中创建了以下内容。
- 复制构造函数
- 赋值运算符
- 析构函数
如果还有其他需要,请告诉我。 谢谢。
您正在使用 C++ 中的
malloc
。你死定了。
You have 2 lives left.
说真的,不要那样做。特别是因为将它与
delete[]
一起使用是明确的 Undefined Behaviour.可悲的是你在这里又失去了一条生命:
Queue obj(data,10); Queue *pqueue=&obj; q.push(pqueue);
您存储 指向本地 的指针。更多Undefined Behaviour
You have 1 life left.
上次生活在
q.pop(&obj);
你使用迭代器弹出。它将被视为输出迭代器。 你得到一个 return 表示弹出的元素数量和项目 将写入
&obj[0]
、&obj[1]
、&obj[2]
等你猜怎么着? Undefined Behaviour.
另请参阅:
You died.
你已经死了。但是你放弃了你的来世
printf("%d\n",obj->getint());
因为
pop
可能没有弹出任何东西(队列可能是空的),这本身就是 Undefined Behaviour.
有趣的是,您谈论所有这些构造函数要求但是您将指针存储在无锁队列中...?!随便写:
typedef std::vector<unsigned char> Data;
class Queue {
private:
Data m_data;
public:
Queue(Data data) : m_data(std::move(data)) {}
Queue() : m_data() {}
unsigned char const *getdata() const { return m_data.data(); }
size_t getint() const { return m_data.size(); }
};
boost::lockfree::spsc_queue<Queue> q(10);
备注:
你需要让消费者检查
pop
的return代码。推送可能没有发生,并且无锁队列不会阻塞。你不需要那个装置。一路传递向量即可:
C++ 代码
#include <boost/lockfree/spsc_queue.hpp>
#include <thread>
#include <iostream>
#include <vector>
typedef std::vector<unsigned char> Queue;
boost::lockfree::spsc_queue<Queue> q(10);
void produce() {
Queue obj(10, 1);
std::cout << __FUNCTION__ << " - " << obj.size() << "\n";
q.push(std::move(obj));
}
void consume() {
Queue obj;
while (!q.pop(obj)) { }
std::cout << __FUNCTION__ << " - " << obj.size() << "\n";
}
int main() {
std::thread t1 {produce};
std::thread t2 {consume};
t1.join();
t2.join();
}