4

Boost 1.46.1でロックの問題を解決しようとしています-いくつか試しましたが、満足していません-したがって、クリーンカットからの入力を聞きたいと思います。

スレッドA:

  • 重要なデータセクションのロックを常に待機して取得する必要があります
  • いくつかの重要なデータを更新します
  • 手動ロック解除(またはスコープ)

スレッドB-決してブロックしてはならない(try_lock?)-ロックが取得された場合、言及されたクリティカルセクションからデータを読み取ります

shared_lockが必要かどうか、またはそれ以外の方法でこれを解決できるかどうかはわかりません。

編集、私のコードは次のようになります:スレッドA:

{
 // Critical section
 boost::mutex::scoped_lock  lock( _mutex) ;
}

スレッドB:

boost::mutex::scoped_lock lock(_mutex, boost::try_to_lock);
if( lock ) {

}

しかし、失敗したtry_lockをログに記録できなかったので、本当に機能するのだろうかと思います。

よろしく、ポール

4

1 に答える 1

7

スコープロックがFIFOではないこと、つまり、ロックを要求する最初のスレッドがロックを取得する最初のスレッドではないことを除いて、私にはそれが機能しているように見えます。テストには次のコードを使用しました。

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

boost::mutex mutex;

void threadA()
{
    for (int i = 10; i > 0; )
    {
        boost::mutex::scoped_lock lock(mutex);
        {
            fprintf(stderr, "Locked by A\n");
            usleep(100000);
            fprintf(stderr, "Unlocked by A\n");
            i--;
        }
    }
}

void threadB()
{
    for (int i = 10; i > 0; )
    {
        boost::mutex::scoped_lock lock(mutex, boost::try_to_lock);
        if (lock)
        {
            fprintf(stderr, "Locked by B\n");
            usleep(100000);
            fprintf(stderr, "Unlocked by B\n");
            i--;
        }
        else
        {
            fprintf(stderr, "Lock failed in B\n");
            usleep(100000);
        }
    }
}

int main(int argc, char **argv)
{
    boost::thread a(threadA);
    boost::thread b(threadB);
    a.join();
    b.join();
}

そして、私は出力を取得します

Locked by A
Lock failed in B
Lock failed in B
Unlocked by A
Locked by A
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Unlocked by A
Locked by A
Lock failed in B
Lock failed in B
Unlocked by A
Locked by A
Unlocked by A
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
Locked by B
Unlocked by B
于 2012-04-16T14:08:48.507 に答える