在MyClass
中有两个功能。 FuncA
发送要执行的命令,而FuncB
检查执行FunA
发送的命令的进度。当FuncB
在while循环中等待,直到确保命令成功执行为止,我在一个单独的线程中调用FuncB
。 FunA
正在运行的线程不应该在while循环中等待。
在 main.cpp 中,有两个函数在两个不同的线程中运行。 execute
做出决定,并在FunA
调用check
时致电FuncB
发送命令,以检查已执行的决策。
由于我不希望execute
多次发送相同的决定,我首先确保FuncA
未运行且FuncB
已重置funcInUse
到false
。
myclass.h
class MyClass
{
public:
MyClass();
void FuncA(float x, floaty, floatz);
bool FuncB(void);
bool IsFuncInUse(void);
void QuitFuncA(void);
private:
bool funcInUse;
bool _x;
std::mutex mtx;
}
myclass.cpp
MyClass::MyClass()
{
funcInUse = false;
}
void MyClass::FuncA(float x, float y, float z)
{
if(funcInUse == true)
{
printf("FuncA already in use\n");
return;
}
// Gaining the lock, so that no two threads call the function at the same time
mtx.lock();
funcInUse = true;
mtx.unlock();
printf("INSIDE FuncA()::: %d\n", funcInUse?1:0);
printf("THIS FuncA() adr=%p \n", this);
// DO STUFF
}
bool MyClass::FuncB(void)
{
if(funcInUse == true)
{
printf("THIS ISPOSREACHED() adr=%p \n", this);
// DO STUFF
// Giving the lock back before returning
mtx.lock();
funcInUse = false;
mtx.unlock();
printf("Function is no more in use\n");
}
return true;
}
bool MyClass:IsFuncInUse(void)
{
return isFuncInUse;
}
void MyClass:QuitFuncA(void)
{
mtx.lock();
funcInUse = false;
mtx.unlock();
}
的main.cpp
MyClass myClass;
void timerStart(std::function<void(void)> func, unsigned int interval)
{
std::thread([func, interval]()
{
while (true)
{
auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
func();
std::this_thread::sleep_until(x);
}
}).detach();
}
void execute(void)
{
if(/*some special condition*/)
{
myClass.QuitFuncA();
}
if(myClass.isFuncInUse() == false)
{
// USE THE FUNCTION
myClass.FuncA();
}
}
void check(void)
{
if(myClass.isFuncInUse())
{
status = myClass.FuncB();
printf("STATUS %d\n", status?true:false);
}
}
int main(void)
{
timerStart(execute, 500);
timerStart(check, 500);
}
问题:FuncA
在一次迭代中将funcInUse
设置为true。在下一次迭代中,funcInUse
再次为假,但FuncB
未重置funcInUse
。在两次迭代之间重置this
会发生什么?
我在调用MyClass
中的三个函数时尝试打印FuncA
,并且所有函数都具有相同的地址。我也尝试使用类和我之前从here学习的类方法,但它没有用。
我尝试使用互斥锁,信号量和条件变量但是我遇到了FuncB
应该获得互斥锁的问题,而MyClass
应该在确保已执行已发送的命令后释放它(这不是允许使用互斥锁)。在一种情况下,isFuncInUse
中的函数应重置funcInUse
。有没有比使用var weatherData = entityContext.Weather
.Include(x => x.Sensor)
.Include(x => x.Position.Location)
.ToList();
变量更好的方法来同步两种方法?
谢谢