1

私はC ++の初心者で、かなり基本的なファイルの読み取りとデータ処理の機能に取り組んでおり、データを消費できるように、少なくともスレッド上の「状態」を別のスレッドに提供できることに固執しています。これは、私が見落としている非常に基本的なものかもしれません-c ++でpthreadsを使用することについての洞察を使用できます。

以下は、正常に機能し、ファイルを読み取り、処理するデータを提供する基本的な抽出コードです。データを処理する別のスレッドは、このスレッドの状態を知る必要があります。最善の戦略は何でしょうか? 別のスレッドから関数を介してスレッドの状態を要求しようとしていますが、正しくない応答を受け取ります。

Reader::Reader(){

    _threadId = 1; 
    _msg = NONE; // enum NONE, READ, STOP
    active = false;
    pthread_mutex_init(&_mutex, 0);
}

Reader::~Reader(){

    pthread_mutex_destroy(&_mutex);
}

void Reader::read(){

    _msg = READ;
    active = true;

    pthread_create(&_threadId, 0, work, this);
}

void * Reader::work(void *myselfreader){

    Reader * reader = (Reader*)myselfreader;

    reader->loop();

    pthread_exit(0);

    return 0;
}

void Reader::loop(){

    while(active){

            pthread_mutex_lock(&_mutex);

            switch(_msg){

                case READ:

                    // do the reading of the IO file - which works fine                 
                    // once done reading the file - the _msg is set to STOP

                    break;

                case STOP:

                    stopThread();

                    break;


                default:
                        break;
            }

            pthread_mutex_unlock(&_mutex);
        }

    return;
}

void Reader::stopThread(){

    active = false;

    _msg = ENC_NONE;

    pthread_join(_threadId, 0);
}

/*****************/

int Reader::getReaderState(){

    // another thread needs to know the state of this thread
    // 
    return _msg // ??
    return active // ??
}
4

1 に答える 1

0

コードのどこかに競合状態があるようです。

_msgミューテックスで変数を保護する必要があります。_msg変数要求ミューテックスを更新する必要があるたびに、変数を更新してミューテックスを閉じます。関数の読み取りについても同じことを行う必要がありgetReaderState()ます-ミューテックスを取得し、変数を一時にコピーし、ミューテックスを解放し、一時変数を返します。

簡単でエラーが発生しやすい使用法のため_msgに、同じミューテックスによって保護されるフィールドにアクセスするための getter および setter 関数を作成する必要があります (既に使用しているミューテックスではありません)。

void setMsg(int msg)
{
    pthread_mutex_lock(&msg_mutex);
    _msg = msg;
    pthread_mutex_unlock(&msg_mutex);
}


int getMsg()
{
    int tmp;
    pthread_mutex_lock(&msg_mutex);
    tmp = _msg;
    pthread_mutex_unlock(&msg_mutex);
    return tmp;
}
于 2012-12-12T01:37:07.673 に答える