std::thread

std::shared_ptr<std::thread> m_spThread;

m_spThread.reset(new std::thread(std::bind(&GameServer::process_thread, this)));

void GameServer::process_thread()
{
try
{
process_thread_try();
}
catch (...)
{
DWORD e = GetLastError();
int a = 0;
}
}
std::bind(&GameServer::process_thread, this)返回一个std::function,绑定成员函数process_thread,然后new std::thread(std::Funciton)返回thread*
reset源码这样的
template<class _Ux>
        void reset(_Ux *_Px)
        {    // release, take ownership of _Px
        shared_ptr(_Px).swap(*this);
        }

就是交换智能指针管理的对象,m_spThread管理这个对象,之后线程函数就自动执行了,我有个疑问为什么这个不用Join或者detach?

具体看下:

一个 std::thread 对象可以接收

普通的函数
函数对象
类的成员函数
lambda 函数
作为参数。

#include <QtCore>
#include <thread>
普通的函数
void test1()
{
    qDebug()<<"hello test 1";
}

void test2(const QString &text)
{
    qDebug()<<"hello"<<text;
}
函数对象
class Test3
{
public:
    Test3(){}
    void operator()() const
    {
        qDebug()<<"hello test3"<<this;
    }
};

class Test4
{
public:
    QString a;
    Test4(const QString a):a(a){}
    void operator()(const QString b) const
    {
        qDebug()<<a<<b;
    }
};
类的成员函数
class Test5
{
public:
    void output()
    {
        qDebug("hello test 5");
    }
};

class Test6
{
public:
    void output(const QString & text)
    {
        qDebug()<<"hello"<<text;
    }
};
以及lambda函数
主程序
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    std::thread t1(test1);
    std::thread t2(test2, "test 2");
    std::thread t3((Test3()));
    std::thread t4(Test4("hello"), "test 4");
    Test5 test5;
    std::thread t5(&Test5::output, &test5);
    Test6 test6;
    std::thread t6(&Test6::output, &test6, "test 6");
    std::thread t7([](const QString & text){qDebug()<<"hello"<<text;}, "test7");
    return a.exec();
}
备忘
添加了两层括号(不然会被编译器认作一个名为t3的函数的声明)

    std::thread t3((Test3()));
std::bind ? 带参数,比如:

    std::thread t2(test2, "test 2");
要写成

    std::thread t2(std::bind(test2, "test 2"));
那一个标准?

std::ref ? (函数对象,或者参数,都是传值,传引用需要使用std::ref),比如对前面的Test3

    Test3 test3;
    test3();
    std::thread t3(test3);
    std::thread t33(std::ref(test3));
这三次调用的结果(类似于):

hello test3 0xbfc3b27f 
hello test3 0xbfc3b27f 
hello test3 0x9811e60 

 

posted @ 2014-03-25 10:21  zzyoucan  阅读(2538)  评论(0编辑  收藏  举报