调用字段的方法,而另一个使用该字段的方法正在执行

时间:2017-03-13 00:06:43

标签: c++

我对运行方法的外部修改有疑问。 鉴于此C ++类:

#include <iostream>
class Foo {
   public:
      Foo()
         : runBar(true) {}

      void bar() {
         int i = 0;
         while(this->runBar) {
            std::cout << "Loop " << i++ << std::endl;
         }
         std::cout << "Loop done!" << std::endl;
      }

      void baz() {
         this->runBar = false;
         std::cout << "Field changed!" << std::endl;
      }

   private:
      bool runBar;
};

并且还给出了main函数:

int main(int argc, char* argv[]) {
   Foo f;
   f.bar();
   f.baz();
   return 0;
}

拨打Foo::baz()时会发生什么? 谢谢你的帮助!

2 个答案:

答案 0 :(得分:2)

由于您只有1个执行线程,并且您没有任何内容可以更改while函数中的bar循环退出条件,因此此代码将永远循环。您的baz函数永远不会被调用。

答案 1 :(得分:0)

假设您打算从不同的线程中调用它们, 这是一个示例,显示main被修改为从一个线程内调用该函数。 Foo使用静音来协调活动,比如允许线程在终止之前完成打印。 连接可防止主节点终止过早结束。 如果你不以某种方式协调它们,就不可能肯定地说出事件的顺序是什么。这就是使用多线程编程的本质。

要么首先运行bar,要么打印,否则baz首先运行,在这种情况下bar不会运行。两种都是可能的。

#include <iostream>
#include <mutex>

mutex aMutex; //<--

class Foo {
   public:
      Foo()
         : runBar(true) {}

      void bar() {
         int i = 0;
         while(this->runBar) {
            aMutex.lock(); //<--
            std::cout << "Loop " << i++ << std::endl;
            aMutex.unlock(); //<--
         }
         std::cout << "Loop done!" << std::endl;
      }

      void baz() {
         this->runBar = false;
         aMutex.lock(); //<--
         std::cout << "Field changed!" << std::endl;
         aMutex.unlock(); //<--
      }

   private:
      bool runBar;
};
#include <thread>

int main(int argc, char* argv[]) {
   Foo f;

   thread myThread { f.bar() }; //call it in a thread
   f.baz();
   myThread.join(); //<--
   return 0;
}