4

以下のboost::threadプログラムの問題点をmwに教えてください

#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;

};

int main()
{
    boost::thread thr1(A());
    boost::thread thr2(A());
    thr1.join();
    thr2.join();

}

エラーメッセージが表示されます:エラー:非クラスタイプの「thr1」のメンバー「join」のリクエスト「boost :: thread()(A()())」BoostThread2.cpp:30:エラー:リクエスト非クラスタイプの「thr2」のメンバー「join」の場合「boost::thread()(A()())」

4

2 に答える 2

7

あなたは、最も厄介な解析として素晴らしく知られている何かに出くわしました。これを修正する最も簡単な方法は、括弧のセットを追加することです。

boost::thread thr1((A()));

一時的なものを導入することもできます。

A tmp1;
boost::thread thr1(tmp1);

最も厄介な解析では、一時的なものを生成していると思われるものは、パラメーターをとらない関数であるかのように解析されます。次に、thr1を、単一のパラメーター(前述の関数)を取り、boost::threadを返す関数のプロトタイプとして扱います。

于 2010-05-15T05:10:23.157 に答える
6

これは古典的なC++トラップです。thr1あなたが思っているものではありません(スレッドオブジェクト)。これは、Aのインスタンスをパラメーターとして受け取る関数の宣言です。括弧で囲んで、意図した解釈を強制します。

boost::thread thr1((A()));
boost::thread thr2((A()));

詳細な説明

構文的には、元の構文は次と同等です。

boost::thread thr1(A);

コンパイラが空の括弧を無視できるのはなぜですか?率直に言って、私にはわかりません—私はC ++言語の専門家ではありません—しかし、それは次の一連の考え方に関係していると思います:A *a= A (*a)、したがってA *= A (*); 同様に、A a= A (a)、したがってA= A ()

未来に目を向けてください!

今後のC++標準では、これが新しい初期化構文の副産物として修正されます。

boost::thread thr1{A()};
boost::thread thr2{A()};
于 2010-05-15T05:05:41.607 に答える