菜鸟笔记
提升您的技术认知

thread线程学习-ag真人游戏

thread线程框架

线程定义:
线程可以理解为一个特立独行的函数。其存在的意义,就是并行,避免了主线程的阻塞。

----------------------------thread与函数----------------------------------

线程启动

  c 线程的启动, 只需要#include 即可。 线程对象的创建, 意味着线程的开始。

1)同步

#include 
#include 
#include 
using namespace std;
void func()
{
    cout<<"thread id:"<

  t.join 和 t.detach 标志着, 线程对象和线程的关系。 t.join 表示, 线程与线程对象的同步关系。 而 t.detach 表示, 线程与线程对象的异步关系。 在线程生成后,必须指定join或者detach状态来。

  detach 后的线程,不能再 join,是否可以 join 可以通过 joinable 来判断。 

2)异步

#include 
#include

using namespace std; void func() { cout<<"thread id:"<

  在次线程detach的状态下,要保证主线程的上声明周期要比次线程声明周期长,否则此线线程将中断退出。

 

 

传参方式

  线程有自己独立的栈。可供享受全局的变量。在线程启动的时候可以传入启动的参数。

#include 
#include 
using namespace std;
void func(int n, string s)
{
    for(int i=0;i 

  除了传入参数,共享全局以外,还可以使用std::ref辅助传入本地变量的引用。thread认为不加std::ref包装的变量都是以拷贝的方式传入线程中去的。

#include 
#include 
using namespace std;
void func(int &n, string &s)
{
    for(int i=0;i  

----------------------------thread与类成员函数-----------------------------------

  以上都是通过线程来包装普通的函数。类的成员函数该如何引入线程呢?如下:

1)类外使用线程(推荐):

#include 
#include 
using namespace std;
class threadtest
{
public:
    threadtest()
    {
        cout<<"threadtest():"<

  这个函数执行起来显然没什么错误,但是有一个问题:我们构造时对象的内存地址居然与多线程中执行函数地址不一样,要记住这可是该对象的成员函数啊?我们前面已经提到过,不使用std::ref传入线程的变量默认都是以拷贝的方式传入的。两次地址不一样的原因就是如此!要想将该对象的成员函数加入线程,我们应该使用std::ref或者直接传入对象的指针。

#include 
#include 
using namespace std;
class threadtest
{
public:
    threadtest()
    {
        cout<<"threadtest():"< 

2)类内使用线程:

 #include

#include 
using namespace std;
class threadinclass
{
public:
    threadinclass(){cout<<"threadinclass():"<
网站地图