1

Linux で C++ でプログラムを作成しました。スレッドには pthread を使用しています。プログラムでスレッドを開始すると、このスレッドは関数を呼び出すまで実行されているため、停止する必要があります。ここで私のコードを見ることができます。

bool isRunning = false;
pthread_t thread;

void startThread() {
    isRunning = true;
    int thread_return = pthread_create(&thread, NULL, runThread, NULL);
}

bool stopThread() {
    isRunning = false;
    // wait until the thread will be finished
    return true;
}

void* runThread(void* ptr) {
    while(isRunning) {
        // do smth.
    }
    pthread_exit(NULL);
}

スレッドが開始されると、それはスムーズに実行されます。の値がisRunningなるまでfalse、メインプログラム自体が他のことを行います。問題は、関数を呼び出すと、この関数が falsestopThreadに設定され、スレッドが while ループ内でタスクを完了するまで待機しないことです。私の質問は、スレッドの終了を待つ必要があることisRunningを function にどのように言うことができるかです。stopThread

に設定した後pthread_joinstopThread関数を入れてみました。しかし、プログラムが無限に待機するという問題が発生することがあります。スレッドが早く終了したため、プログラムがスレッドを待つようになります。スレッドは while ループ内の別の部分に存在する可能性があるためです。そのため、スレッドがどれだけ終了する必要があるかわかりません。isRunningfalse

ありがとうございました

4

3 に答える 3

2

あなたの質問で私が理解していることから、スレッド結合の概念を使用する必要があります。

そのようです、

bool stopThread() {
    int returnCode;
    isRunning = false;
    void *status;
    rc = pthread_join(your_thread, &status);

    // wait until the thread will be finished

    if (rc) {
        printf("ERROR; return code from pthread_join() 
                is %d\n", rc);
        exit(-1);
    }
    printf("Main: completed join with thread %ld having a status   
            of %ld\n",t,(long)status);

    return true;
}
于 2011-07-12T18:24:32.197 に答える
1

関数を見てくださいpthread_joinpthread_joinの単一UNIX仕様ドキュメント。

この関数を使用するには、スレッドIDを追跡する必要があります。一般的なパラダイムはThread、その情報をカプセル化したクラスを持つことのようです。

于 2011-07-12T18:21:27.287 に答える
1

この場合、それを実行できるはずですがpthread_join()、何らかの理由でそれが機能しない場合は、hasFinished変数を追加してみてください(そしてhasFinished == true、スレッドを閉じている場所で待機しています...)

bool isRunning = false;
pthread_t thread;

// TODO FIX: this is a workaround due to pthread_join() not working properly
bool hasFinished = false

void startThread() {
    isRunning = true;
    int thread_return = pthread_create(&thread, NULL, runThread, NULL);
}

bool stopThread() {
    isRunning = false;
    // wait until the thread will be finished
    return true;
}

void* runThread(void* ptr) {
    while(isRunning) {
        // do smth.
    }

    // TODO FIX: this is a workaround because pthread_join() is not working properly
    hasFinished = true;
    pthread_exit(NULL);

}

[明確化のために編集:]

スレッドを停止する場所

/**/
// TODO FIX: this following is a workaround due to pthread_join() not working
isRunning = false;

int TimeoutSleep_ms = 100;
// TimeoutSleep_ms * TimeoutCounter is the timeout time, 10 sec for this case
int TimeoutCounter = 100; 

while (!hasFinished && (--TimeoutCounter > 0))
    sleep(100);
// END TODO FIX
/**/
于 2011-07-12T18:25:34.973 に答える