0

Boost スレッド ライブラリを使用して、いくつかのマルチスレッド コードを作成しました。メンバー関数 fillSample(int num) に必要な引数としてプレースホルダー _1 を使用して、コンストラクターで 2 つのスレッドを初期化しました。しかし、これは私の Visual Studio 2010 ではコンパイルできません。コードは次のとおりです。

#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();
}

既に placeholders.hpp ヘッダー ファイルをインクルードしましたが、まだコンパイルされません。_1 を 0 に置き換えると、機能します。しかし、これはスレッド関数を0で初期化します。これは私が望むものではありません。これを機能させる方法についてのアイデアはありますか?

4

1 に答える 1

0

作成を初期化リストに移動します: m_ThreadWrite(boost::bind(&ECG::fillSample, this, _1)), ...

threadオブジェクトはコピー可能ではなく、コンパイラはその移動コンストラクタをサポートしていません。

于 2012-09-14T18:50:08.993 に答える