例如,如果我有以下代码:
SomeType obj;
void GUIThread()
{
...
while (true)
// Read and print the content of obj
...
}
void workerThread()
{
...
// Do some calculation and write the result into obj
...
}
出于性能原因,我不能在
obj
上使用互斥锁或类似方法,也不需要GUIThread
打印出的内容的准确度(obj
存储workerThread
的运行计算结果,可以将其视为“运行总计” GUIThread
需要做的只是显示在workerThread
中完成的计算的大概进度。我要确保的是,GUIThread
和workerThread
之间的读写竞争条件不会更改obj
中存储的数据,并且不会导致程序崩溃。真的吗?P.S.
SomeType
包含内置的整数类型和std::bitset<T>
,但是只有前者将被同时访问。 bitset
保持不变。P.P.S.也许这有点超出主题范围了...但是我想我可以将运行结果存储在
GUIThread
中的缓存中,并且每隔较长的时间就仅更新实际 protected (通过原子性或互斥锁或其他方式)。为此,我需要确保以下代码是否能按预期工作:struct SomeOtherType
{
int a, b, c, d; // And other primitive types
}
std::atomic<SomeOtherType> data; // Will this work?
我想知道这是否可以保护
workerThread
,而且我认为可以,因为SomeOtherType
中只有原始类型。 最佳答案
据我了解,您的结构看起来像这样
struct Data {
int one;
int two;
std::bitset<SomeType> three;
}
如果您不想对其使用任何类型的锁,则可以尝试交换指向此结构的共享指针。检查您的编译器是否支持它,这是一项新功能。
std::shared_ptr<Data> dataPointer;
void GUIThread()
{
...
while (true) {
auto ptr = std::atomic_load(&dataPointer);
// Read and print the content of *ptr
...
}
void workerThread()
{
...
// Do some calculation
auto newPtr = std::make_shared<Data>();
// make the new result visible to the gui thread
std::atomic_store(&dataPointer, newPtr);
}
关于c++ - 读写竞争条件会改变同时读取和写入的数据吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21577584/