std::bind与std::thread学习笔记

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;
}

 

 

你可能感兴趣的:(总结,c++)