_
*this
_で識別されるスレッドの実行が完了するまで、現在のスレッドをブロックします。
これは、.join()
を使用する場合、そのスレッドが関数を呼び出すときにmutex.lock()
を使用する必要がないことを意味しますか?私は相互排除とスレッド化に慣れていないので、ちょっと混乱しています。
注:「C++ Concurrency in Action」という本を見つけました。その本を読んでいます。私のようなマルチスレッドの初心者向けに非常によく書かれています。
助けてくれてありがとう。
まだミューテックスと条件が必要です。スレッドに参加すると、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は共有リソースアクセスであるため、その使用もミューテックスで保護する必要があります。
join()は、別のスレッドが終了するまで現在のスレッドを停止します。 mutexは、mutexの所有者が解放するか、ロックされていない場合はすぐにロックするまで、現在のスレッドを停止します。だから、これらの人はかなり異なっています
Join()が呼び出されるスレッドの実行が完了するまで、現在のスレッドをブロックします。
スレッドでjoin()またはdettach()を指定しない場合、メイン/現在のスレッドが実行を完了し、作成された他のスレッドがまだ実行されているため、実行時エラーが発生します。