2016-11-01 13 views
-1

私は以下のチュートリアルで読んでいます:C++ Multithreading Tutorial。 10個の固有のスレッドを作成し、スレッド番号の文字列を出力するチュートリアルのコードをコンパイルしました。ここでミューテックスとスレッド:説明

は、コードが、リンクを開くためにしたくない人のために次のようになります。

#include <iostream> 
#include <thread> 

static const int num_threads = 10; 

//This function will be called from a thread 

void call_from_thread(int tid) { 
    std::cout << "Launched by thread " << tid << std::endl; 
} 

int main() { 
    std::thread t[num_threads]; 

    //Launch a group of threads 
    for (int i = 0; i < num_threads; ++i) { 
     t[i] = std::thread(call_from_thread, i); 
    } 

    std::cout << "Launched from the main\n"; 

    //Join the threads with the main thread 
    for (int i = 0; i < num_threads; ++i) { 
     t[i].join(); 
    } 

    return 0; 
} 

私は、コードを実行すると、それはコンパイルし、出力は一種のランダムです。 各スレッドは起動しますが、順番に起動されません。

私はstd :: mutexのC++リファレンスを読んでいました。それは私の必要としているように聞こえます。

こういうコードでstd:mutexをどのように実装すれば、スレッドが同じ共有リソースを使用しないようにすることができますか? 。

+0

あなたは彼らが順番に起動しなかったと思いますか?コードは非常に明確にそれらを順番に起動します。 –

+0

[Mutex example/tutorial?]の可能な複製(http:// stackoverflow。com/questions/4989451/mutex-example-tutorial) – TemporalWolf

+0

問題の 'std :: mutex'はどこにありますか?また 'std :: mutex'は厳密な実行順序を保証するものではありません。 –

答えて

1

スレッドは正しい順序で作成されますが、実行のスケジューリングの順序は同じであるとは限りません。

mutexはソリューションですか?

ミューテックスを追加しようとする可能性があります。これは2つのスレッドが同時にクリティカルセクションに含まれていないことを保証します:これは例外ですRAIIを使用してミューテックスをロック:私は直接、ミューテックスをロックしていなかったと私はlock_guardを好ま

std::mutex mtx; 

void call_from_thread(int tid) { 
    std::lock_guard<std::mutex> lock(mtx); // holds the lock until scope is left 
    std::cout << "Launched by thread " << tid << std::endl; 
} 

ノートTHAを安全。

Online demo 1

ミューテックスずにマルチスレッド化を行う別の方法

ソリューションアトミックで、アトミック変数を使用することです。これらは、データ競合のない一度に1つのスレッドによってアクセスされることが保証されています。

std::atomic<int> cnt{0}; 

void call_from_thread(int tid) { 
    while (cnt!=tid) 
     std::this_thread::yield(); 
    std::cout << "Launched by thread " << tid << std::endl; 
    cnt++; 
} 

もちろん、上記のコードは無用です。スレッドが順番に実行されるようにします。すべてのスレッドは、グローバル原子カウンターがその番号に対応しているかどうかを調べます。そうであれば、グローバルカウンタを実行してインクリメントする。そうでない場合、別のスレッドに実行する機会が与えられます。もちろん

Online demo 2

ここで、この構造は時間の無駄です。通常は、条件変数を使用してこのようなことを行います。それはイラストだけです。

結論

マルチスレッドは非常に複雑です。それを掘り下げたいのであれば、アンソニー・ウィリアムの著書「C++ Concurrency in action」をお勧めします。これは、C++マルチスレッド・ライブラリだけでなく、マルチスレッド・アルゴリズムの課題にも踏み込んでいます。

関連する問題