![](/img/trans.png)
[英]Unexpected behavior using `std::count` on `std::vector` of pairs
[英]Unexpected behavior using std::map with std::thread
因此,我需要為我的應用程序創建一個線程池,這導致我創建了一個std::map<int, std::thread>
對象。 我遇到了一些非常意外的行為,可以將其簡化為:
std::map<int, std::thread> threads;
threads.insert(std::pair<int, std::thread>(1, std::thread([]() {
std::cout << "I'm the first thread and I'm gonna work\n";
})));
threads[1].join();
std::cout << "Thread 1 joinable? " << threads[1].joinable() << "\n";
threads.insert(std::pair<int, std::thread>(1, std::thread([]() {
std::cout << "I'm not gonna work at all\n";
})));
threads[1].join();
輸出是
I'm the first thread and I'm gonna work
Thread 1 joinable? 0
之后,將調用std::terminate()
,程序將接收SIGABRT信號。
實時調試表明正在調用terminate
,因為joinable()
為true,但是我只是檢查了一下,發現不是這樣!
而且,克服它的方法就是在join()
之后添加以下行:
threads.erase(1);
這讓我有些困惑,因為它看起來像是在我的insert
調用之前創建的std::thread
的新實例...有人可以提示我這種意外行為嗎?
從http://en.cppreference.com/w/cpp/container/map/insert中 :
如果容器尚未包含具有等效鍵的元素,則將其插入容器。
您的地圖已經在鍵1
處包含一個元素,因此第二個threads.insert
不執行任何操作。 您只是想在同一std::thread
上加入兩次。 這就是為什么threads.erase(1);
解決了問題,您的地圖不再在鍵1
處包含線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.