https://www.jb51.cc/csharp/1193445.html

编程之家收集整理的这篇文章主要介绍了C++11多线程编程基础入门编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

1.在C++11中创建新线程

在每个c++应用程序中,都有一个认的主线程,即main函数,在c++11中,我们可以通过创建std::thread类的对象来创建其他线程,每个std :: thread对象都可以与一个线程相关联,只需包含头文件< thread>。可以使用std :: thread对象附加一个回调,当这个新线程启动时,它将被执行。 这些回调可以为函数指针、函数对象、Lambda函数。 线程对象可通过std::thread thObj(< CALLBACK>)来创建,新线程将在创建新对象后立即开始,并且将与已启动的线程并行执行传递的回调。此外,任何线程可以通过在该线程的对象上调用join()函数来等待另一个线程退出。 使用函数指针创建线程:

CmakeLists.txt

每个std::thread对象都有一个相关联的id,std::thread::get_id() —-成员函数中给出对应线程对象的id; std::this_thread::get_id()—-给出当前线程的id,如果std::thread对象没有关联的线程,get_id()将返回认构造的std::thread::id对象:“not any thread”,std::thread::id也可以表示id。

2.joining和detaching 线程

线程一旦启动,另一个线程可以通过调用std::thread对象上调用join()函数等待这个线程执行完毕:

例如,主线程启动10个线程,启动完毕后,main函数等待他们执行完毕,join完所有线程后,main函数继续执行:

detach可以将线程与线程对象分离,让线程作为后台线程执行,当前线程也不会阻塞了.但是detach之后就无法在和线程发生联系了.如果线程执行函数使用了临时变量可能会出现问题,线程调用了detach在后台运行,临时变量可能已经销毁,那么线程会访问已经被销毁的变量,需要在std::thread对象中调用std::detach()函数:

调用detach()后,std::thread对象不再与实际执行线程相关联,在线程句柄上调用detach() 和 join()要小心.

3.将参数传递给线程

要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数认情况下,所有的参数都将复制到新线程的内部存储中。 给线程传递参数:

给线程传递引用:

输出结果为: In Main Thread : Before Thread Start x = 9 Inside Thread x = 10 In Main Thread : After Thread Joins x = 9

Process finished with exit code 0 即使threadCallback接受参数作为引用,但是并没有改变main中x的值,在线程引用外它是不可见的。这是因为线程函数threadCallback中的x是引用复制在新线程的堆栈中的临时值,使用std::ref可进行修改

int x = 9;  std::cout << "In Main Thread : Before Thread Start x = " << x << std::endl;

输出结果为: In Main Thread : Before Thread Start x = 9 Inside Thread x = 10 In Main Thread : After Thread Joins x = 10

Process finished with exit code 0 指定一个类的成员函数的指针作为线程函数,将指针传递给成员函数作为回调函数,并将指针指向对象作为第二个参数: