在排除简单的提升线程程序时出错

Ete*_*ner 4 c++ boost-thread

你能告诉我下面的boost :: thread程序有什么问题吗?

#include<iostream>
#include<boost/thread/thread.hpp>

boost::mutex mutex;

class A
{
public:
A() : a(0) {}

void operator()()
{
          boost::mutex::scoped_lock lock(mutex);

}
private:
int a;
Run Code Online (Sandbox Code Playgroud)

};

int main()
{
    boost::thread thr1(A());
    boost::thread thr2(A());
    thr1.join();
    thr2.join();
Run Code Online (Sandbox Code Playgroud)

}

我收到错误消息:错误:请求'thr1'中的成员'join',这是非类型类型'boost :: thread()(A()())'BoostThread2.cpp:30:错误:请求对于'thr2'中的成员'join',它是非类型的'boost :: thread()(A()())'

R S*_*hko 7

你偶然发现了一个奇怪的被称为最令人烦恼的解析的东西.解决这个问题的最快方法是添加一组额外的括号:

boost::thread thr1((A()));
Run Code Online (Sandbox Code Playgroud)

你也可以介绍一个临时的:

A tmp1;
boost::thread thr1(tmp1);
Run Code Online (Sandbox Code Playgroud)

在最令人烦恼的解析中,您认为生成临时的内容被解析为好像它是一个不带参数的函数.然后它将thr1视为一个函数的原型,该函数接受一个参数(这是前面提到的函数)并返回一个boost :: thread.


Mar*_*tos 6

这是一个经典的C++陷阱.thr1不是你认为的(一个线程对象).它是一个函数的声明,它将A的实例作为参数.用括号括起来强制执行预期的解释:

boost::thread thr1((A()));
boost::thread thr2((A()));
Run Code Online (Sandbox Code Playgroud)

详细解释

从语法上讲,原始语法相当于:

boost::thread thr1(A);
Run Code Online (Sandbox Code Playgroud)

为什么允许编译器忽略空括号?坦率地说,我不确定 - 我不是C++语言专家 - 但我认为它必须遵循以下思路:A *a= A (*a),因此A *= A (*); 同样,A a= A (a),因此A= A ().

展望未来!

即将推出的C++标准将把它作为其新的初始化语法的副产品来解决:

boost::thread thr1{A()};
boost::thread thr2{A()};
Run Code Online (Sandbox Code Playgroud)