相关疑难解决方法(0)

构造std::thread对象过程详解

我对构造std::thread对象的细节很感兴趣(并对此感到困惑)。根据cppreference,线程函数和所有参数都被值复制到一些线程可访问的存储中,然后调用。

1)这个线程可访问的存储究竟是什么?是不是语义上等同于某种线程本地存储,在线程函数返回后销毁变量?

2) 传递给线程函数时参数的值类别是什么?cppreference 上的描述表明它们作为左值传递(无论如何它们都被赋予了名称)。我对 GCC 和 clang 的测试似乎表明相反,即 r 值。具体来说,以下代码无法编译:

void f(int& a) {
  std::cout << ++a << '\n';
}

int main() {
    std::thread t(&f, 1);
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我们f改为

void f(int&& a) {
  std::cout << ++a << '\n';
}

int main() {
    std::thread t(&f, 1);
    t.join();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么,标准对此有何看法?

c++ multithreading language-lawyer c++11 stdthread

6
推荐指数
1
解决办法
1126
查看次数

标签 统计

c++ ×1

c++11 ×1

language-lawyer ×1

multithreading ×1

stdthread ×1