我有一个对象std :: vector的向量,而fo对象有一个方法start(),其中我创建了特定于该对象的线程,现在依赖于该对象的变量,我想将其置于睡眠状态。
因此,例如,如果我的对象是f1且变量是bool sleep = false;
,则当sleep变量为true时,我希望它进入睡眠状态。
我已经尝试过这种方法,但是它似乎不起作用。我认为如果
class fo {
public :
thread* t ;
bool bedient = false , spazieren = false;
void start(){
t = new thread([this]() {
while (!this->bedient){
if (this->spazieren == true){
std::this_thread::sleep_for(std::chrono::seconds(10));
this->spazieren = false ;
}
}
this->join();
});
}
void join(){
t->join(); delete t;
}
};
答案 0 :(得分:1)
您在代码上“产生了”很多问题:
1)
在一个线程中设置任何种类的变量可能在任何其他线程中都不可见。如果要让其他线程看到您在第一个线程中所做的更改,则必须同步内存。这可以通过对数据的每次更改使用std::atomic
进行锁定和解锁,或者使用class fo {
public :
std::thread* t=nullptr ; // prevent corrupt delete if no start() called!
std::atomic<bool> bedient = false ;
std::atomic<bool> spazieren = false;
void start()
{
t = new std::thread([this]()
{
while (!this->bedient)
{
if (this->spazieren == true)
{
std::cout << "We are going to sleep" << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(3));
this->spazieren = false ;
}
}
std::cout << "End loop" << std::endl;
});
}
~fo() { delete t; }
void join()
{
std::cout << "wait for thread ends" << std::endl;
t->join();
}
};
int main()
{
fo f1;
f1.start();
sleep(1);
f1.spazieren = true;
sleep(1);
f1.bedient = true;
f1.join();
}
变量来完成,这些变量本身可以进行同步或其他许多方法。请阅读有关多线程编程的书!
2) 您尝试加入自己的线程。那根本不是正确的用法。任何线程都可以在其他执行端联接,但不能在其自身联接。没道理!
3) 如果您没有手动设置“ sleep”变量,则您的线程正在运行一个循环,并且什么也不做。加热内核和行星的好方法;)
using namespace std
顺便说一句:
<form asp-controller="PanelController" asp-action="AddCatAndSubAndBrand" method="post">
!答案 1 :(得分:0)
我会尝试将您的代码重构为使用std :: future而不是std :: thread,此外,我相信您会在短期内遇到一些问题。
我会考虑以下重构:
#include <memory>
#include <future>
#include <atomic>
class fo
{
public:
~fo()
{
this->_bedient = true;
_workThread.wait();
}
void start()
{
_workThread = std::async(std::launch::async, [this]() -> bool
{
while(!this->_bedient)
{
if(true == this->_spazieren)
{
std::this_thread::sleep_for(std::chrono::seconds(10));
this->_spazieren = false;
}
else
{
std::this_thread::yield();
}
}
return true;
});
}
void ShouldSleep(bool shouldSleep)
{
this->_spazieren = shouldSleep;
}
void ShouldStop(bool shouldStop)
{
this->_bedient = !shouldStop;
}
private:
std::future<bool> _workThread = {};
std::atomic<bool> _bedient{ false };
std::atomic<bool> _spazieren{ false };
};