- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用 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
函数中涉及的机制并不完全理解。如果这样的函数立即返回或者可以延迟直到可以锁定标志。
对于我来说,如何使用这样一个总是设置值并返回先前值的函数来获得锁定机制也是一个谜。没有仅读取实际设置的选项。
欢迎提出任何建议。
最佳答案
By the way the process involved in one of the threads is very long query to a dBase who get many rows, and I only need suspend it in a certain zone of code where the collision occurs (when processing each row) and I can't wait the entire thread to finish join().
这样的区域称为临界区。使用临界区的最简单方法是通过互斥 锁定。
建议的互斥锁解决方案确实是可行的方法,除非您可以证明这是一个热点并且锁争用是一个性能问题。 仅使用原子和内在函数的无锁编程非常复杂,在此级别不推荐。
这是一个简单的示例,展示了如何执行此操作(在 http://liveworkspace.org/code/6af945eda5132a5221db823fa6bde49a 上直播):
#include <iostream>
#include <thread>
#include <mutex>
struct A
{
std::mutex mux;
int x;
A() : x(0) {}
};
void threadf(A* data)
{
for(int i=0; i<10; ++i)
{
std::lock_guard<std::mutex> lock(data->mux);
data->x++;
}
}
int main(int argc, const char *argv[])
{
A instance;
auto t1 = std::thread(threadf, &instance);
auto t2 = std::thread(threadf, &instance);
t1.join();
t2.join();
std::cout << instance.x << std::endl;
return 0;
}
关于c++ - 是否有可能在 C++ 中使用 std::atomic_flag 获得线程锁定机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12826168/
我有一个 struct,我们称它为 struct foo,我想向其添加一个 atomic_flag 变量。到目前为止,我一直在 callocing 结构,因为它主要需要进行零初始化。我应该如何初始化
我正在使用 C++ std::atomic_flag作为一个原子 bool 标志。将标志设置为真或假不是问题,但是如何在不将其设置为某个值的情况下查询标志的当前状态?我知道有方法'atomic_fla
我在 cplusplus.com 尝试了使用 atomic_flag 的基本示例. Valgrind 的 Helgrind 工具报告 164 errors from 28 contexts (supp
以这种方式初始化 std::atomic_flag 真的很有必要: std::atomic_flag flag = ATOMIC_FLAG_INIT; 在我看来它应该有相同的结果: std::atom
我正在尝试熟悉 c++11 的新内存排序概念,并且相信我实际上已经很好地掌握了它们,直到我偶然发现了自旋锁的这个实现: #include namespace JayZ { namespace
我正在尝试熟悉 c++11 的新内存排序概念,并且相信我实际上已经很好地掌握了它们,直到我偶然发现了自旋锁的这个实现: #include namespace JayZ { namespace
使用 std::atomic_flag 时, 必须小心始终使用 ATOMIC_FLAG_INIT 显式初始化它,这是容易出错的。然而,有一个默认构造函数...那么,在让标志处于未指定状态的默认构造函数
在类构造函数中初始化 std::atomic_flag 的安全方法是什么? This question似乎在问我问的同一个问题 - 除了这里提问者提示编译器问题。 我的问题与 C++ 标准本身有关。根
摘自 C++ 并发实践: difference between std::atomic and std::atomic_flag is that std::atomic may not be lock
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
比较 std::atomic_flag 到std::atomic_bool (又名 std::atomic ),在我看来 std::atomic_flag只是有一个更简单的界面。它仅提供测试+设置和清
我有一个简单的 bool 值,需要以线程安全的方式进行测试和设置。如果一个线程已经在工作,我希望第二个线程退出。如果我明白std::atomic_flag正确,这应该可以正常工作。但是,我不确定我是否
我正在尝试使用 atomic_flag 实现自旋锁。我知道使用 C++11 我必须初始化 atomic_flag 变量,但我无法编译它。我的代码如下所示: class SpinLock { publ
抱歉冗长 - 我已尽力将我的代码示例压缩为一个功能最少的类和 main() 方法。 我正在尝试使用 atomic_flag 通知我的工作线程中的 _rx() 在调用 stop() 时退出。 我认为问题
当调用notify_one()时,是否有关于在atomic_flag上调用wait()的线程被唤醒的顺序的公平性信息。它们是否按照进入 wait() 的确切顺序被唤醒,可以说是 FIFO 吗? 原子标
自 std::lock_guard不适用于 std::atomic_flag我已经实现了我自己的版本: class atomic_guard { public: inline atomic_g
使用 MS Visual C++2012 一个类有一个std::atomic_flag类型的成员 class A { public: ... std::atomic_flag
std::atomic_flag 有 2 个具有这些默认 std::memory_order 的函数: void clear(std::memory_order order = std::memory
我想知道使用 Windows 的 interlockedXXX 函数和使用 std::atomic_flag 访问 bool 值之间有什么区别。 据我所知,它们都是无锁的,您无法直接设置或读取 ato
我实现了一个小的多线程应用程序,它执行以下操作: 主线程 A main thread starts a timer using setitimer and starts up to 8 threads
我是一名优秀的程序员,十分优秀!