无法在Xcode,C ++ 11中初始化线程

时间:2016-11-22 15:34:25

标签: xcode multithreading c++11 boost

我正在尝试实现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的标准库

请帮忙。

我在哪里做错了?

1 个答案:

答案 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中使用。

有关lambda的更多信息,请herehere