C++多线程学习笔记

头文件

#include <thread>

创建一个线程

void func()
{
    cout << "func" << endl;
    return;
}
thread thread1(func);

上述代码创建了一个线程thread1,func为该线程执行的函数,若该函数有入口参数,则在线程创建时加入一个参数,后续会介绍。

一、基础代码

创建一个线程打印 “func“ 字符串

#include <iostream>
#include <thread>
using namespace std;

void func()
{
    cout << "func" << endl;
    return;
} 
int main()
{
    thread thread1(func);
    cout << "over" << endl;
    return 0;
}

编译正确、执行错误,终端打印信息如下

(base)@auto:~/shares/cplusplus/mutl_threads$ ./mytest.o 
over
terminate called without an active exception
func
Aborted (core dumped)

原因:
main函数执行完成后,thread1线程还没执行完毕;
解决方法:利用join阻断

#include <iostream>
#include <thread>
using namespace std;

void func()
{
    cout << "func" << endl;
    return;
} 
int main()
{
    thread thread1(func);
    thread1.join();					# 改动
    cout << "over" << endl;
    return 0;
}

thread1 线程会在语句 thread1.join() 处等待,thread1结束后再执行后面的语句,终端运行结果:

(base)@auto:~/shares/cplusplus/mutl_threads$ ./mytest.o
func
over

若将thread1.join(); 放在语句cout << “over” << endl;之后,即

#include <iostream>
#include <thread>
using namespace std;

void func()
{
    cout << "func" << endl;
    return;
} 
int main()
{
    thread thread1(func);
    cout << "over" << endl;
    thread1.join();
    return 0;
}

则打印结果为

(base)@auto:~/shares/cplusplus/mutl_threads$ ./mytest.o
over
func

这是由于主程序执行到cout << “over” << endl;时,线程thread1还没打印完func;即两个线程此时同时进行,可想而知若我们打印一定长时间,则两个打印结果会交替出现,即:

#include <iostream>
#include <thread>
using namespace std;

void func()
{
    for (int i = 0; i < 1000; i++)
        cout << "a";
    return;
} 
int main()
{
    thread thread1(func);
    for (int i = 0 ; i < 1000; i++)
        cout << "b";
    thread1.join();
    cout << endl;
    return 0;
}

终端打印结果为

(base)@auto:~/shares/cplusplus/mutl_threads$ ./mytest.o
over
func
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbabaaababbbbbbbbbbbbbbbbbbababababbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbaababababbbbbbbbbbbbbbbbabaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbabaababbbbbbbbbbbbbbbbbababababaabaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbbbababaaaaababbbbbbbbbbbbbbbbbabaabaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaababababbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbababaaaaaaaaaaaaaaaaababaababbbbbbbbbbbbbbbbbabaaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbbbabaaaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbbabaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbababbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbababaabaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbaabaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaababbbbbbbbbbbbbbbbbbabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

果然不出所料。
为了保证线程的安全性,有些线程是不能调用 join() 函数的,故需要判断函数是否可以使用 join() ,可以的情况下再调用,即:

#include <iostream>
#include <thread>
using namespace std;

void func()
{
    for (int i = 0; i < 1000; i++)
        cout << "a";
    return;
} 
int main()
{
    thread thread1(func);
    bool isjoin = thread1.joinable();
    if (isjoin)
    	thread1.join();
    for (int i = 0 ; i < 1000; i++)
        cout << "b";
    cout << endl;
    return 0;
}

二、传入函数含参数

#include <iostream>
#include <thread>
#include <string>
using namespace std;

void printhw(string s)
{
    for (int i = 0; i < 1000000000; i++)
        ;
    cout << s << endl;
    return;
} 
int main()
{
    string s = "HI";
    thread thread1(printhw, s);
    bool isjoin = thread1.joinable();
    if (isjoin)
    {
        thread1.join();
    }
    cout << "over" << endl;
    return 0;
}

2.1 传入局部变量时

#include <iostream>
#include <thread>
using namespace std;

thread t;

void foo(int& x)
{
    for (int i = 0; i < 1000000000; i++)
        ;
    x += 1;
}

int test()
{
    int x = 1;
    t = thread(foo, ref(x));

    return x;
}
int main()
{
    cout << test() << endl;
    bool isjoin = t.joinable();
    if (isjoin)
        t.join();
    return 0;
}

上述程序可以看到在主程序中test()函数已经执行完毕,而线程t还在执行,故输出值为1,为了解决此类情况,可以将join阻断加入到局部变量中

#include <iostream>
#include <thread>
using namespace std;

thread t;

void foo(int& x)
{
    for (int i = 0; i < 1000000000; i++)
        ;
    x += 1;
}

int test()
{
    int x = 1;
    t = thread(foo, ref(x));
    bool isjoin = t.joinable();
    if (isjoin)
        t.join();
    return x;
}
int main()
{
    cout << test() << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值