Multithreading 为什么创建此增强线程会';不编译?

Multithreading 为什么创建此增强线程会';不编译?,multithreading,boost,bind,Multithreading,Boost,Bind,我使用Boost线程库编写了一些多线程代码。我使用占位符_1作为成员函数fillSample(int num)所需的参数初始化了构造函数中的两个线程。但这并没有在我的VisualStudio2010中编译。代码如下: #include<boost/thread.hpp> #include<boost/thread/condition.hpp> #include<boost/bind/placeholders.hpp> #define SAMPLING_FRE

我使用Boost线程库编写了一些多线程代码。我使用占位符_1作为成员函数fillSample(int num)所需的参数初始化了构造函数中的两个线程。但这并没有在我的VisualStudio2010中编译。代码如下:

#include<boost/thread.hpp>
#include<boost/thread/condition.hpp>
#include<boost/bind/placeholders.hpp>

#define SAMPLING_FREQ 250
#define MAX_NUM_SAMPLES 5*60*SAMPLING_FREQ
#define BUFFER_SIZE 8

class ECG
{
private:
    int sample[BUFFER_SIZE];
    int sampleIdx;
    int readIdx, writeIdx;
    boost::thread m_ThreadWrite;
    boost::thread m_ThreadRead;
    boost::mutex m_Mutex;
    boost::condition bufferNotFull, bufferNotEmpty;
public:
    ECG();
    void fillSample(int num);   //get sample from the data stream
    void processSample();   //process ECG sample, return the last processed 

};


ECG::ECG() : readyFlag(false), sampleIdx(0), readIdx(0), writeIdx(0)
{
    m_ThreadWrite=boost::thread((boost::bind(&ECG::fillSample, this, _1)));
    m_ThreadRead=boost::thread((boost::bind(&ECG::processSample, this)));
}

void ECG::fillSample(int num)
{
    boost::mutex::scoped_lock lock(m_Mutex);
    while( (writeIdx-readIdx)%BUFFER_SIZE == BUFFER_SIZE-1 )
    {
        bufferNotFull.wait(lock);
    }

    sample[writeIdx] = num;
    writeIdx = (writeIdx+1) % BUFFER_SIZE;
    bufferNotEmpty.notify_one();

}

void ECG::processSample()
{
    boost::mutex::scoped_lock lock(m_Mutex);
    while( readIdx == writeIdx )
    {
        bufferNotEmpty.wait(lock);
    }

    sample[readIdx] *= 2;
    readIdx = (readIdx+1) % BUFFER_SIZE;
    ++sampleIdx;
    bufferNotFull.notify_one();
}
#包括
#包括
#包括
#定义采样频率250
#定义最大采样数5*60*采样频率
#定义缓冲区大小8
类心电图
{
私人:
int样本[缓冲区大小];
int-sampleIdx;
int readIdx,writeIdx;
boost::线程m_ThreadWrite;
boost::线程m_ThreadRead;
boost::mutex m_mutex;
boost::条件bufferNotFull,bufferNotEmpty;
公众:
心电图();
void fillSample(int num);//从数据流获取样本
void processSample();//处理ECG样本,返回上次处理的
};
ECG::ECG():readyFlag(false)、sampleIdx(0)、readIdx(0)、writeIdx(0)
{
m_ThreadWrite=boost::thread((boost::bind(&ECG::fillSample,this,_1));
m_thread=boost::thread((boost::bind(&ECG::processSample,this));
}
无效ECG::fillSample(int num)
{
boost::mutex::作用域锁定(m_mutex);
而((writeIdx readIdx)%BUFFER\u SIZE==BUFFER\u SIZE-1)
{
缓冲区未满。等待(锁定);
}
样本[writeIdx]=num;
writeIdx=(writeIdx+1)%BUFFER\U大小;
bufferNotEmpty.notify_one();
}
void ECG::processSample()
{
boost::mutex::作用域锁定(m_mutex);
while(readIdx==writeIdx)
{
bufferNotEmpty.wait(lock);
}
样本[readIdx]*=2;
readIdx=(readIdx+1)%BUFFER\u SIZE;
++样本;
bufferNotFull.notify_one();
}

我已经包含了placeholders.hpp头文件,但它仍然没有编译。如果我将_1替换为0,那么它将工作。但是这将用0初始化线程函数,这不是我想要的。关于如何进行此操作,有什么想法吗?

将创建移动到初始化列表: m_ThreadWrite(boost::bind(&ECG::fillSample,this,_1))


线程
对象不可复制,并且您的编译器不支持其移动构造函数。

我看不到任何地方定义了此
\u 1
。它是一个标识符吗?编译器说了什么有趣的事情吗?例如,日志中的错误消息?不幸的是,这也不起作用。我必须编写一个单独的方法start来为成员函数fillSample()和processSample()创建线程。@tonga你说“这也不行”是什么意思?不编译吗?你看到了什么编译器错误?好的,我自己解决了。基本上,我需要编写start()和join()方法来启动线程,而不是在构造函数中初始化线程。