gpt4 book ai didi

multithreading - 使用std::atomic同步的线程之间共享数据

转载 作者:行者123 更新时间:2023-12-03 13:19:39 28 4
gpt4 key购买 nike

我有生产者和消费者线程,每个线程1个。两者都必须共享一些数据(可以是某些用户定义的类的对象)。我想使用c++ 11 std::atomic来同步访问,以便在生产者写入共享数据时,如果消费者开始读取,消费者等待生产者完成。

如果下面的代码可以实现此目的,请仔细阅读代码并提出您的意见。您可以假定生产者线程和使用者线程正在调用set并获取已使用某些数据对象初始化的SharedData类的对象。

感谢您的宝贵时间和宝贵的意见。

template <typename T>
class SharedData
{
static const int SD_BUSY = 0x01;
static const int SD_FREE = 0x02;
typedef std::atomic<int> AtomicInt;

struct AcqRel
{
AtomicInt& _atomInt;
AcqRel(AtomicInt& atomInt) :_atomInt(atomInt)
{
int expectedValue = SharedData::SD_FREE;
do
{
expectedValue = SharedData::SD_FREE;
} while (!_atomInt.compare_exchange_strong(expectedValue, SharedData::SD_BUSY));
}

~AcqRel()
{
_atomInt.store(SharedData::SD_FREE);
}
};

AtomicInt _atomInt = SD_FREE;
T _data;

public:
void set(T& data)
{
AcqRel al(_atomInt);
_data = data;
}

void get(T& data)
{
AcqRel al(_atomInt);
data = _data;
}
};

请提出一种无锁方法来实现我在上面尝试过的方法。我想通过一些无锁方法在线程之间共享数据。

最佳答案

该实现看起来正确,这意味着它没有数据争用,并且提供了所需的数据保护。但是正如Casey已经评论过的那样,您实际上是在尝试模仿互斥行为。而且您的实现效率较低,因此没有必要这样做。毕竟,尽管名称为AcqRel,该类实际上仍采用默认的memory_seq_cst语义。最好在这里真正使用acquire/release(尽管std::mutex更好)。

关于multithreading - 使用std::atomic同步的线程之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29014455/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com