例如,如果我有以下代码:

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中完成的计算的大概进度。我要确保的是,GUIThreadworkerThread之间的读写竞争条件不会更改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/

10-10 20:56