-1

問題があります。スレッドコードにこのポインターがあり、そこで変更されていますが、メインに戻ると、次のように変更はありません。

スレッド

void threaded_function(Model_factory &mf, ppa::Node *root) { // threads management

try { // n try...

主要

 int main(int argc, char *argv[]) { ...

主にノードルートを作成しています。スレッドでは、ノードにシーケンスが与えられ、次のように true に変化する bool があります。

ppa::Node *root;

そして、スレッドが機能している(スレッドグループ)で、必要に応じてそのブール値を取得および設定できますが、スレッドグループがすべての結合で終了すると(これはブーストです)、ポインタールートはこの行で0を返します

cout << root->has_sequence() << endl;

これが続き、ノードが再び何かで満たされると、なぜノードポインタがスレッドの変更を反映していないのか、それは設計なのか、それとも間違っているのか (おそらく 2 番目)、どうすればよいかを尋ねたいと思います。グローバルルートノードで問題は解決しますが、なぜですか?

4

1 に答える 1

1

競合状態がある場合は、ロックされていない重要なセクションにアクセスしていると思われる必要があります。ミューテックス変数を手動でロックおよびロック解除していることに気付きました。これにより、コードでエラーが発生する可能性があります。たとえば、次の構造は特に驚くべきものに見えます。

for (int i = 0; i < deque_done.size(); i++) {

    tuple_compare(deque_done.at(i));

    result_mutex.unlock();

}

手動でロックおよびロック解除する代わりに、 および を使用してロックの取得と解放を管理することを検討してboost::recursive_mutexくださいboost::recursive_mutex::scoped_lock

boost::recursive_mutex result_mutex;

void foo () {
    boost::recursive_mutex::scoped_lock lock(result_mutex);
    //...
}

複数のスレッドからの再入を許可する再帰アルゴリズムの設計を本当に主張する場合は、読み取りロックには , およびboost::shared_mutex/boost::shared_lockを使用し、書き込みアクセスには/を使用できます。例については、このリンクをたどることができます。boost::upgradeable_lockboost::unique_lockboost::upgrade_to_unique_lock

于 2012-07-31T07:51:43.093 に答える