簡體   English   中英

按值將std :: thread推入列表

[英]Pushing std::thread by value into a list

我的代碼如下所示:

#include <list>
#include <thread>

void my_function(int val) {
    // Empty function
}

int main() {
    std::list<std::thread> threads;
    for (int i = 0 ; i < 10 ; i++) {
        threads.push_back(std::thread(my_function, i));
    }

    return 0;
}

我使用threads.push_back()的事實意味着我運行了復制構造器std::thread::thread(const thread&)

  • 安全嗎?

  • 我應該使用std::move嗎?

請假設我事先不知道需要多少個線程,所以用數組或std::vector替換列表對我來說不是一個選擇( std::vector僅是一個選擇如果我提前知道線程數,因為我負擔不起向量的realloc操作)。

我使用threads.push_back()的事實意味着我運行了復制構造函數

不,不是的。 由於C ++ 11 push_back重載以接受對列表的值類型的右值引用。

您不能運行std::thread的副本構造函數,因為它被聲明為Deleted。 添加了上述的push_back重載,以達到支持僅移動類型(例如線程句柄)的確切目的。

如果您希望不移動而直接將線程直接初始化到容器中,則emplace_back可以執行此操作。 但是您需要傳入std::thread構造函數的參數,而不是從中初始化的線程:

threads.emplace_back(my_function, i);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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