C++11 为什么std::thread的参数转换在创建的线程中执行,而不是在父线程中执行?

C++11 为什么std::thread的参数转换在创建的线程中执行,而不是在父线程中执行?,c++11,race-condition,stdthread,C++11,Race Condition,Stdthread,我最近了解到std::thread的这种不幸行为 void func(std::string param); void evil() { char buff[4096]; sprintf(buff,"%i",rand()); std::thread t(func, buff); t.detach(); } (这里的问题是buff退出,从char*到std::string的转换在被调用的线程中完成) 解决方案是创建如下线程: st

我最近了解到std::thread的这种不幸行为

    void func(std::string param);

    void evil()
    {
    char buff[4096];
    sprintf(buff,"%i",rand());
    std::thread t(func, buff);
    t.detach();
    }
(这里的问题是buff退出,从char*到std::string的转换在被调用的线程中完成) 解决方案是创建如下线程:

std::thread t(func, std::string(buff));

但是我的问题是,ISO选择这种行为的原因是什么(当你认为它仍然是许多bug的潜在来源时,这是完全合乎逻辑的…。

实际上,由于
std::thread
构造函数将数据复制/移动到线程本地缓冲区,这应该很有效…@filmor,但这不是一个肤浅的cpy,也就是说,它将ptr复制到阵列,而不是整个阵列。我想是的。但这比您建议的要简单得多(即
std::thread
的构造函数声明中的一个缺点)。使用
std::array
,它具有适当的复制语义,一切都应该正常。正如@filmor所说,几乎没有理由不使用STL数据结构而不是旧的c风格arrays@aaronman :)