2017-11-20 4 views
0

任意のid値を取得するのではなく、既知の固定された整数に関連付けられたスレッドIDを取得したいとします。例えばthread :: idのstd :: mapを整数値に作成する

#include <iostream> 
#include <thread> 
#include <mutex> 
#include <map> 
#include <vector> 

using namespace std; 

std::mutex mu; 
std::map<std::thread::id, int> threadIDs; 

void run(int i) { 
    std::unique_lock<mutex> map_locker(mu); 
    std::cout << "Thread " << threadIDs.insert(std::make_pair(std::this_thread::get_id(), i)) << endl; 
    map_locker.unlock(); 
} 

int main() { 
    std::thread the_threads[3]; //array of threads 
    for (int i = 0; i < 3; i++) { 
     //launching the threads 
     the_threads[i] = std::thread(run, i); 
    } 

    for (int i = 0; i < 3; i++) { 
     the_threads[i].join(); 
    } 
} 

:上記のコードを実行するときに

Thread ID  Integer value 
4    0 
2    1 
5    2 

私はエラーを取得する:

test.cpp:14:28: error: invalid operands to binary expression ('basic_ostream >' and 'pair' (aka 'pair<__map_iterator<__tree_iterator, std::__1::__tree_node, void *> *, long> >, bool>')) std::cout << "Thread " << threadIDs.insert(std::make_pair(std::this_thread::get_id(), i)) << endl;

+2

'std :: unique_lock'を手動でアンロックする必要はありません。それは、その寿命の終わりに常にロックを解除するように設計されています。 –

+1

'std :: unique_lock'があなたに与えるものは、実際には*必要なものではありません。 'std :: lock_guard'で十分です。 –

答えて

4
std::pairostream(許可されたタイプ here見経由で印刷することができません

)ので、メンバーを個別に印刷する必要があります。

lock_guard<mutex> map_locker(mu); 
pair<thread::id, int> p = make_pair(this_thread::get_id(), i); 
threadIDs.insert(p); 
cout << "Thread (" << p.first << ", " << p.second << ")" << endl; 

@FrançoisAndrieuxで指摘したように、それが破壊されますときに、自動的に(スコープの外に出る)ロックを解除として、あなたは、手動にunlockunique_lock必要はないことに注意してください。

@ JesperJuhlによれば、この状況ではlock_guardがより優れています(探している機能は最低限です)。

関連する問題