1

ミューテックスがロックされるのを待っている間にコード セクションを実行する方法はありますか?

アプリケーションのパフォーマンスに対する唯一の真の内部ヒットはデータベースの相互作用であり、データベースの相互作用が原因で競合が発生する可能性がある厳密な同期が必要な場合があるため、ロックを待っている時間を使用して、データベース。

たとえば、コードを疑似的に次のようにしたいと思います。

boost::unique_lock<boost::mutex> process_lock(process_mutex, work_while_contending);
//code to execute while lock contending
process_lock.proceed_after_lock();

ブーストの同期セクションを調べたところ、意図が達成されたようfuturesrecursive聞こえますが、意図を実装する方法がわかりません。

私の意図はどのように実装できますか?

4

2 に答える 2

3

ほとんどの場合、これを行う必要はありません。どうしてもやりたい場合は、次のように先物を使用することをお勧めします。

auto f = std::async(std::launch::async, [&]() {
   // do work in another thread here.
});

boost::unique_lock<boost::mutex> process_lock(process_mutex);
auto result = f.get();

// proceed here the work is done and you have the lock

...これにより、元のスレッドがミューテックスを待っている間に別のスレッドで作業を行うことができます。作業が完了し、ミューテックスが取得されると、スレッドは続行されます。ミューテックスが取得される前に作業が終了すると、作業スレッドはなくなり、元のスレッドはミューテックスを待ってアイドル状態になります。

これを行いたくない理由は次のとおりです。作業が完了する前にミューテックスを取得すると、他のスレッドがミューテックスを取得できなくなり、「バックグラウンド」作業が完了するのを待つ間にプログラムが停止します。

考えられる解決策は、ノンブロッキングでビジー待機ループを使用することtry_lockです。ここでの潜在的な問題は、スレッドがミューテックスを待機していないことです。そのため、スレッドがミューテックスを取得できるという保証はありません。それに対して多くの競合があり、他の人が積極的に待っている場合、あなたは決してそれを手に入れることはできません. それを待つと、通常、OS は何らかの順序を保証して、最終的にそれを取得します。待っていなければ、その保証はできません。

于 2014-05-28T00:56:02.683 に答える