使用 MS Visual C++2012
一个类有一个类型的成员std::atomic_flag
class A {
public:
...
std::atomic_flag lockFlag;
A () { std::atomic_flag_clear (&lockFlag); }
};
有一个 A 类型的对象
A object;
谁可以被两个(Boost)线程访问
void thr1(A* objPtr) { ... }
void thr2(A* objPtr) { ... }
如果对象正在被另一个线程访问,这个想法是等待线程。
问题是:有可能用一个atomic_flag
对象来构建这样的机制吗?暂时不要这么说,我想要一些轻量级的 boost::mutex。
顺便说一下,其中一个线程所涉及的进程是对获得许多行的 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 */
}
但没有成功,因为第二个线程挂起。其实我对atomic_flag_test_and_set_explicit
函数所涉及的机制并不完全了解。如果这样的函数立即返回或者可以延迟直到标志可以被锁定,也不会。
对我来说,如何获得一个总是设置值并返回前一个值的函数的锁定机制也是一个谜。没有选项只能读取实际设置。
欢迎任何建议。