47

C ++リファレンスからの定義による:

*thisによって識別されるスレッドが実行を終了するまで、現在のスレッドをブロックします。

つまり、これは、を使用するときに、そのスレッドが関数を呼び出すときに.join()必要がないことを意味しますか?mutex.lock()私は相互排除とスレッド化に慣れていないので、ちょっと混乱しています。

注:C ++ Concurrency in Actionの本を見つけ、その本を読んでいます。私のようなマルチスレッドの初心者向けに非常によく書かれています。

助けてくれてありがとう。

4

4 に答える 4

33

ミューテックスと条件はまだ必要です。スレッドに参加すると、実行の1つのスレッドが、別のスレッドの実行が終了するのを待機します。共有リソースを保護するには、ミューテックスが必要です。これにより、この例のmain()は、すべてのスレッドが終了するのを待ってから終了することができます。

#include <iostream>
#include <thread>
#include <chrono>
#include <mutex>

using namespace std;



int global_counter = 0;
std::mutex counter_mutex;

void five_thread_fn(){
    for(int i = 0; i<5; i++){
        counter_mutex.lock();
        global_counter++;
        counter_mutex.unlock();
        std::cout << "Updated from five_thread"  << endl;
        std::this_thread::sleep_for(std::chrono::seconds(5));
    }
    //When this thread finishes we wait for it to join
}

void ten_thread_fn(){
    for(int i = 0; i<10; i++){
        counter_mutex.lock();
        global_counter++;
        counter_mutex.unlock();
        std::cout << "Updated from ten_thread"  << endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
    //When this thread finishes we wait for it to join
}
int main(int argc, char *argv[]) {
    std::cout << "starting thread ten..." << std::endl;
    std::thread ten_thread(ten_thread_fn);

    std::cout << "Running ten thread" << endl;
    std::thread five_thread(five_thread_fn);


    ten_thread.join();
    std::cout << "Ten Thread is done." << std::endl;
    five_thread.join();
    std::cout << "Five Thread is done." << std::endl;
}

出力は次のようになることに注意してください。

starting thread ten...
Running ten thread
Updated frUopmd atteend_ tfhrroema df
ive_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from five_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from ten_thread
Updated from five_thread
Ten Thread is done.
Updated from five_thread
Updated from five_thread
Five Thread is done.

std :: coutは共有リソースアクセスであるため、その使用もミューテックスで保護する必要があります。

于 2013-03-01T00:23:21.577 に答える
12

join()は、別のスレッドが終了するまで現在のスレッドを停止します。mutexは、mutexの所有者がスレッドを解放するか、ロックされていない場合はすぐにロックするまで、現在のスレッドを停止します。だからこれらの人はかなり異なっています

于 2013-03-01T00:13:29.777 に答える
7

join()が呼び出されたスレッドの実行が完了するまで、現在のスレッドをブロックします。

スレッドでjoin()またはdettach()を指定しない場合、メイン/現在のスレッドが実行を完了し、作成された他のスレッドが引き続き実行されるため、ランタイムエラーが発生します。

于 2016-01-28T03:05:18.680 に答える
-3

std :: thread.joinには、私が手に負えないと考えることができる3つの関数と他のいくつかの関数があります。

a)スレッドの継続的な作成/終了/破棄を奨励するため、パフォーマンスを向上させ、アプリのリーク、スレッドの暴走、メモリの暴走、および一般的な制御不能の可能性を高めます。

b)不要な待機を強制することで、GUIイベントハンドラーを詰め込みます。その結果、顧客が嫌う「砂時計アプリ」が応答しなくなります。

c)応答性がなく、中断できないスレッドの終了を待機しているため、アプリのシャットダウンに失敗します。

d)その他の悪いこと。

あなたがマルチスレッドに不慣れであることを理解しています、そして私はあなたがそれで最高であることを望みます。また、私は今夜たくさんのAdnams Broadsideを持っていたと考えてください、しかし:

Join()と、TThread.WaitFor(Delphi)のような他の言語の友達は、Windows MEがオペレーティングシステムに対して行ったように、効率的なマルチスレッド化を行っています。

プール、タスク、アプリの有効期間のスレッド、生産者/消費者キューを介したスレッド間通信など、他のマルチスレッドの概念を理解するために一生懸命努力してください。実際、Join()以外のほとんどすべてのもの。

于 2013-03-01T01:40:57.800 に答える