4

C / C ++の場合スレッド(POSIX pthreads / Windowsスレッド)を作成して、実行の進行状況またはスレッドで実行することを決定した作業の進行状況をメインスレッドに戻す安全な方法を提供するにはどうすればよいですか? 。

進捗状況をパーセンテージで報告することは可能ですか?

4

2 に答える 2

5

メイン スレッドと 1 つの関数の非常に単純なケースを想定します。私がお勧めするのは、スレッドを起動するたびに、(上記の Kirill が提案したように) アトミックへのポインターを渡すことです。ここでは C++11 を想定しています。

using namespace std;

void threadedFunction(atomic<int>* progress)
{
    for(int i = 0; i < 100; i++)
    {
        progress->store(i);  // updates the variable safely
        chrono::milliseconds dura( 2000 );
        this_thread::sleep_for(dura); // Sleeps for a bit
    }
    return;
}

int main(int argc, char** argv)
{
    // Make and launch 10 threads
    vector<atomic<int>> atomics;
    vector<thread> threads;
    for(int i = 0; i < 10; i++)
    {
        atomics.emplace_back(0);
        threads.emplace_back(threadedFunction, &atomics[i]);
    }

    // Monitor the threads down here
    // use atomics[n].load() to get the value from the atomics
    return 0;
}

私はそれがあなたが望むことをすると思います。スレッドのポーリングは省略しましたが、おわかりいただけたでしょうか。メイン スレッドと子スレッドの両方が知っているオブジェクト (この場合はatomic<int>変数) を渡します。このオブジェクトは、どちらも結果を更新および/またはポーリングできます。完全な C++11 スレッド/アトミック サポート コンパイラを使用していない場合は、プラットフォームが決定するものを使用しますが、変数 (少なくとも a void*) をスレッド関数に渡す方法は常にあります。そして、それが、非静的を介して情報をやり取りするための何かを取得する方法です。

于 2012-10-20T04:28:20.623 に答える