我想要一个异步线程来编辑一个对象。因此,我存储了一个指向该对象的指针。
Data *pointer;
还有一个类型标志std::atomic<bool>
来知道辅助线程是否正在修改指针指向的对象。虽然标志成立,但主线程不会影响指针及其底层对象。
std::atomic<bool> modifying;
void Thread()
{
// wait for jobs
for(;;)
{
// the flag is set to true my the main thread
// to let this thread start processing
if(modifying)
{
// modify the object the pointer points to,
// pass the pointer to a function to do so,
// and so on...
// the flag to false to tell the main thread
// that it can read the result from the pointer
// and prepare it for the next job
modifying = false;
}
}
}
- 如何确保线程安全?
我无法包装指针,std::atomic
因为我需要从辅助线程将指针传递给期望非原子Data*
类型作为参数的函数。
- 指针甚至需要特别声明为原子的吗?我认为处理器在编写单个寄存器期间不会更改线程。或者我是否必须让它成为原子以防止不需要的编译器优化?
- 如果指针是原子的,那么底层对象也是如此吗?换句话说,我可以使用从中获得的指针来修改
pointer.load()
对象吗?
感谢您的澄清。