0

所以我有一个像这样的课程:

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的线程和 3Get个循环调用的线程。我需要让我的线程Get不超过一次数据和平(这意味着它不能Get像我们一样快速调用Set它,这没关系,但它不会多次调用它 unteel newSet被调用)。我的意思是在线程调用之后Get它不会获得对GetunteelSet执行的访问权限。如何将这样的事情实现到如此简单的类中,或者我的锁会默认为我做吗?

4

2 回答 2

2

你需要一个条件变量

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

这需要改进,但可以完成工作。我通常会使用 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;
};
于 2011-01-17T12:11:11.057 回答
1

您需要使用条件变量向其他线程发出对象状态变化的信号。

于 2011-01-17T12:09:19.807 回答