gpt4 book ai didi

c++ - 仅在新数据上解锁线程(线程调用顺序)

转载 作者:行者123 更新时间:2023-11-28 01:08:44 25 4
gpt4 key购买 nike

所以我有这样一个类:

class mySafeData
{
public:
void Set(int i) {
boost::mutex::scoped_lock lock(myMutex);
myData = i;
}
void Get( int& i)
{
boost::mutex::scoped_lock lock(myMutex);
i = myData;
}
private:
int myData;
boost::mutex myMutex;

};

我有一些在循环中调用 Set 的线程和 3 个在循环中调用 Get 的线程。我需要让我的线程 Get 一个和平的数据不超过一次(这意味着它不能像我们 Set 一样快地调用 Get 并且没关系,但在调用新的 Set 之前,它不应多次调用它)。我的意思是,在调用 Get 的线程之后,它不得访问 Get unteel Set 已执行。如何将这样的事情实现到如此简单的类中,或者我的锁会默认为我做这件事吗?

最佳答案

你需要一个 condition variable .

请注意,即使您的阅读器线程获取与条件变量相关联的互斥锁,它也需要检查是否满足条件。也许让 setter 在设置了一些东西时设置一个标志,而读者在读取它时可以重置它。

这需要改进,但可以完成工作。我通常会使用 std::deque,这样编写者就可以在必须锁定的情况下写入,而不必等待线程读取它。

class mySafeData
{
public:
mySafeData() : myData(0), changed( false )
{
}

void Set(int i)
{
boost::mutex::scoped_lock lock(myMutex);
while( changed )
myCondvar.wait( lock ); // wait for the data to be read

myData = i; // set the data
changed = true; // mark as changed
myCondvar.notify_one(); // notify so a reader can process it
}

void Get( int& i)
{
boost::mutex::scoped_lock lock(myMutex);
while( !changed )
{
myCondvar.wait( lock );
}
i = myData;
changed = false; // mark as read
myCondvar.notify_one(); // notify so the writer can write if necessary
}
private:
int myData;
boost::mutex myMutex;
boost::condition_variable myCondvar;
bool changed;
};

关于c++ - 仅在新数据上解锁线程(线程调用顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4712895/

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