std::bind
1、bind函数,如果在创建std::bind将参数设置为具体变量,则在执行该bind函数时,这个参数的值就为设置时变量的值。并不会因为在调用bind的函数之前,使用的变量发生改变,而使用改变后的值。(bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中)
2、bind函数,如果在创建std::bind将参数设置为placeholders,则在执行该bind函数时,需要有具体的值传入其中,在执行该函数就使用该值。另外,该条与上一条可以结合使用。
3、bind函数,如果在创建std::bind时,使用类中的非静态函数,需要取函数的地址,并且传入第一个参数为类的对象指针。
std::thread
1、thread对象,如果使用没有执行函数的构造函数创建的对象,该线程没有线程ID
2、thread对象,可以使用lambda函数创建,
3、thread对象,可以通过std::move进行赋值,将创建的局部对象赋值给全局对象进行保存
class CLambdaFuncInThread
{
public:
CLambdaFuncInThread()
: m_count(0)
, m_bThreadRunning(false)
{
};
CLambdaFuncInThread(const CLambdaFuncInThread &) = delete;
~CLambdaFuncInThread()
{
if (m_tObj.joinable())
{
m_tObj.join();
}
}
void PrintDefaultThreadID()
{
std::cout << "m_tObj ThreadID: " << m_tObj.get_id() << std::endl;
}
void Start()
{
m_bThreadRunning = true;
std::thread t(
[this]()
{
std::cout << "Lambda ThreadID: " << std::this_thread::get_id() << std::endl;
while (this->m_bThreadRunning)
{
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "Count: " << ++this->m_count << std::endl;
}
});
m_tObj = std::move(t);
std::cout << "After move, m_tObj: " << m_tObj.get_id() << std::endl;
};
void Stop()
{
m_bThreadRunning = false;
}
private:
std::thread m_tObj;
public:
int m_count;
bool m_bThreadRunning;
};
int _tmain(int argc, _TCHAR* argv[])
{
CLambdaFuncInThread lambdaThread;
lambdaThread.PrintDefaultThreadID();
lambdaThread.Start();
getchar();
return 0;
}