std::thread 学习初步

标准库(C++0x)中的 thread 用起来似乎蛮简单的。

例子

一个 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 

参考

  • http://www2.research.att.com/~bs/C++0xFAQ.html#std-thread

  • http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-3.html


你可能感兴趣的:(thread,c,Class,lambda,编译器,output)