我对运行方法的外部修改有疑问。 鉴于此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()
时会发生什么?
谢谢你的帮助!
答案 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;
}