簡體   English   中英

使用std :: map和std :: thread的意外行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM