【发布时间】:2012-10-10 18:41:18
【问题描述】:
使用 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函数所涉及的机制。如果这样的函数立即返回或者可以延迟直到标志可以被锁定,也不会。
对我来说,如何获得具有这样一个函数的锁定机制也是一个谜,该函数总是设置值并返回先前的值。没有选项只能读取实际设置。
欢迎提出任何建议。
【问题讨论】:
-
您在寻找无锁算法吗?
-
实际上,您应该只使用互斥锁来保护您想要同步访问的内容。这就是互斥锁的用途。此外,如果您确实希望多个线程同时访问,请使用信号量。
-
@Tony 我需要进一步了解信号量,但需要互斥体是对象的成员吗?你能在每个线程中发布互斥锁的简短快照吗?
-
A object();是一个函数声明。 -
GManNickG 好的。好的。已更正。有一个默认的构造函数。其他想法?
标签: c++ boost c++11 boost-thread atomic