6
void foo ( Bar* bar , void(Bar::*qux)(void) )
{
    if ( bar )
    {
        bar->qux();
    }
}

問題は:

  1. bar別のスレッドによるチェックに削除できます。

  2. Barロックするためにミューテックスメンバーを追加できません。

したがって、この関数をアトミックに実行するようにプロセッサに指示できるかどうか、またどのように実行するのでしょうか。私はグーグルで多くの時間を過ごしましたが、理解できるマニュアルが見つかりませんでした...

PS Debian、gcc、Boostは許可されていません、C++11許可されています。

4

4 に答える 4

4

おそらく、共有所有権セマンティクス(たとえばshared_ptrintrusive_ptr)を備えたスマートポインターを使用して、オブジェクトを参照している限り、オブジェクトが存続することを確認する必要があります。

于 2012-09-13T14:10:51.167 に答える
4

別のスレッドがオブジェクトを削除しないようにするために、オブジェクトの所有権を一時的に共有したいとします。これはの仕事であり、アクセスする必要がないときに削除を許可するためshared_ptrに使用します。weak_ptr

void foo ( std::weak_ptr<Bar> weak_bar , void(Bar::*qux)(void) ) 
{
    if (std::shared_ptr<Bar> bar = weak_bar.lock())
    {
        // We now share ownership of the object - it won't be deleted
        bar->qux();
    }

    // We have released ownership - it can now be deleted
}

もちろん、複数のスレッドがオブジェクトにアクセスする必要がある場合は、同期が必要です。これは、質問で指定された削除の問題を解決するだけです。

于 2012-09-13T14:20:01.967 に答える
2

申し訳ありませんが、ありません。C++にはそれをサポートするものは何もありません。必ずしもミューテックスをに追加する必要はありませんがBar、それを回避するには、おそらくラッパーBar、またはその順序の何かが必要になります。

于 2012-09-13T14:06:21.357 に答える
2

アトミックメソッドの概念は、メソッドを同期として定義できるJavaのようにC++には存在しません。C ++でそれに最も近いのは、次のようにScopedMutexクラスを作成することです。

class ScopedMutex {
public:
    ScopedMutex(pthread_mutex *m) : theMutex_(m) {pthread_mutex_lock(theMutex_);}
    ~ScopedMutex() { pthread_mutex_unlock(theMutex_); }
    // Add appropriate copy constructors and operator=() to disallow mutex copy
    // Or consider passing in a reference
private:
    pthread_mutex *theMutex_;
};

次に、関数で次のように使用します。

void foo ( Bar* bar , void(Bar::*qux)(void) )
{
    ScopedMutex m(&aMutex); // This mutex must be defined/initialized elsewhere

    if ( bar )
    {
        bar->qux();
    }

    // The ScopedMutex goes out of scope when the function does,
    // thus releasing the lock
}

しかし、barオブジェクトを使用する他のすべてのメソッドで同じミューテックスを使用しない限り、これは何の役にも立ちません。

スコープ付きミューテックスは、いくつかのreturnステートメントがある複雑なロジックを持つ関数がある場合に特に便利です。したがって、関数がスコープ外になるとアンロックされるミューテックスを手動でロック解除する必要はありません。

于 2012-09-13T14:49:34.360 に答える