我正在尝试实现boost的spsc_queue。
但初始化线程会引发错误。我不能同时使用std :: thread以及boost线程。
sharedQueue.hpp `
#include <stdio.h>
#include <iostream>
#include <queue>
#include <thread>
#include <mutex>
#include <boost/thread.hpp>
#include <boost/lockfree/spsc_queue.hpp>
using namespace std;
class sharedQueue
{
boost::lockfree::spsc_queue<int> lockFreeQ{100};
std::queue<int> comQue;
int head =0;;
int tail = 0;
public:
sharedQueue();
std::mutex lockForQueue;
void write(int writeValue);
int read();
void startTesting();
void TestWrite(int MaxElement);
void lockFreeProduce();
void lockFreeConsume();
void TestLockFreeQueue();
};`
以下是sharedQueue.cpp
#include "sharedQueue.hpp"
int sharedQueue :: read(){
int readValue;
lockForQueue.lock();
if(!(comQue.empty()))
{
readValue = comQue.front();
comQue.pop();
}
lockForQueue.unlock();
return readValue;
}
void sharedQueue :: write(int writeValue){
lockForQueue.lock();
comQue.push(writeValue);
tail++;
lockForQueue.unlock();
}
void sharedQueue:: startTesting(){
std::cout<<"Size of the que --"<<comQue.size()<<std::endl;
}
void sharedQueue:: TestWrite(int maxEle ){
for(int i = 0 ; i < maxEle; i ++){
write(i);
}
}
void sharedQueue::lockFreeProduce(){
for(int i = 0; i < 10; i++){
cout <<“Produced-- "<< i<<endl;
lockFreeQ.push(i);
}
}
void sharedQueue::lockFreeConsume(){
for(int i = 0; i <10; i++){
lockFreeQ.front();
cout << “ Consume-- "<<lockFreeQ.pop();
}
}
void sharedQueue:: TestLockFreeQueue(){
std::thread t1(lockFreeProduce);
std::thread t2(lockFreeConsume);
t1.join();
t2.join();
} `
我正在使用Xcode。我试过改变 C ++从GNU ++ 11到c ++ 11的语言方言 从libstdC ++到libc ++ 11的标准库
请帮忙。
我在哪里做错了?
答案 0 :(得分:0)
您正在尝试将成员函数作为新线程运行,而不是普通的旧函数。成员函数的语法不同。
void sharedQueue:: TestLockFreeQueue(){
std::thread t1(std::bind(&sharedQueue::lockFreeProduce, this));
std::thread t2(std::bind(&sharedQueue::lockFreeConsume, this));
t1.join();
t2.join();
}
以下答案假设我们正在讨论non-static
成员函数。 static
成员函数的行为与普通函数指针的行为方式相同。
成员函数指针比普通旧函数指针复杂,并且不能以独立方式调用,即只有在存在该类的对象实例时才能调用它。
See this示例和read this以便更好地理解成员函数指针。
更简单的方法是,而不是使用bind
来创建一个可调用的对象,就是使用lambda,C ++ 11以及你应该在任何时候使用lambda over bind。
使用lambda的示例:
void sharedQueue:: TestLockFreeQueue(){
std::thread t1([this]() { this->lockFreeProduce(); });
std::thread t2([this]() { this->lockFreeConsume(); });
t1.join();
t2.join();
}
这里我将lambda
传递给线程的构造函数,该构造函数创建一个匿名函子结构。方括号[...]
是捕获列表,它复制this
指针,以便可以在lambda中使用。