MS Visual C++2012 の使用
クラスには型のメンバーがありますstd::atomic_flag
class A {
public:
...
std::atomic_flag lockFlag;
A () { std::atomic_flag_clear (&lockFlag); }
};
タイプAのオブジェクトがあります
A object;
2 つの (Boost) スレッドからアクセスできるユーザー
void thr1(A* objPtr) { ... }
void thr2(A* objPtr) { ... }
アイデアは、オブジェクトが他のスレッドによってアクセスされている場合、スレッドを待機することです。
問題は、そのようなメカニズムをatomic_flag
オブジェクトで構築できるかどうかです。現時点では言うまでもありませんが、boost::mutex のような軽量化が必要です。
ちなみに、スレッドの1つに関連するプロセスは、多くの行を取得するdBaseへの非常に長いクエリであり、(各行を処理するときに)衝突が発生するコードの特定のゾーンでのみ中断する必要があり、できませんスレッド全体が終了するのを待ちますjoin()
。
各スレッドで次のように試しました:
thr1 (A* objPtr) {
...
while (std::atomic_flag_test_and_set_explicit (&objPtr->lockFlag, std::memory_order_acquire)) {
boost::this_thread::sleep(boost::posix_time::millisec(100));
}
... /* Zone to portect */
std::atomic_flag_clear_explicit (&objPtr->lockFlag, std::memory_order_release);
... /* the process continues */
}
しかし、2 番目のスレッドがハングするため、成功しません。実は、そのatomic_flag_test_and_set_explicit
機能に関わるメカニズムを完全には理解していません。そのような関数がすぐに戻るか、フラグがロックされるまで遅らせることができるかどうか。
また、常に値を設定し、前の値を返すような関数でロック機構を取得する方法も謎です。実際の設定のみを読み取るオプションはありません。
どんな提案でも大歓迎です。