我有两个问题 - 考虑两个线程,一个对共享数据进行更改,另一个对共享数据进行操作。两个线程在对数据进行任何操作之前都会获取一个互斥锁。
如何保证对数据进行操作的线程总是看到第一个线程所做的更改?是否需要一组获取/释放栅栏,或者线程是否通过使用互斥锁隐式同步?如果我不使用互斥锁(但要确保独占访问)怎么办?
并且:在没有交错/后续原子操作的情况下,栅栏实际上会做任何事情吗(例如,将标志存储在 atomic_bool 中,发出“准备就绪”或其他信号)?
这是一个用例:
void func()
{
std::atomic_bool quit = false;
std::vector<float> data(100);
std::mutex m;
std::thread one([&]()
{
while (!quit.load(std::memory_order_relaxed))
{
std::unique_lock<std::mutex> lock(m, std::try_to_lock);
if (lock.owns_lock())
{
for (int i = 0; i < data.size(); ++i)
{
data[i] = std::rand();
}
std::atomic_thread_fence(std::memory_order::memory_order_release);
}
}
}
);
std::thread two([&]()
{
while (!quit.load(std::memory_order_relaxed))
{
std::unique_lock<std::mutex> lock(m, std::try_to_lock);
if (lock.owns_lock())
{
// guaranteed that any changes from thread one to 'data' is seen after this fence?
std::atomic_thread_fence(std::memory_order::memory_order_acquire);
auto res = std::accumulate(data.begin(), data.end(), 0);
std::cout << "Accumulated result is: " << res << std::endl;
}
}
}
);
fgetc(stdin);
quit.store(true);
one.join(); two.join();
}