你能告诉我下面的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()())'
你偶然发现了一个奇怪的被称为最令人烦恼的解析的东西.解决这个问题的最快方法是添加一组额外的括号:
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.
这是一个经典的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)