当前位置:   article > 正文

【C++】 多线程_c#线程执行完之后会释放吗

c#线程执行完之后会释放吗

1 创建线程

std::thread类中的成员函数:

函数名作用
get_id获取线程ID,返回一个类型为std::thread::id的对象
joinable检查线程是否可被join
join调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被join的std::thread对象标识的线程执行结束。
detach将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。
yield()将调用者线程跳出运行状态,重新交给操作系统进行调度,即当前线程放弃执行,操作系统调度另一线程继续执行
sleep_until()将线程休眠至某个指定的时刻(time point),该线程才被重新唤醒
sleep_for()将线程休眠某个指定的时间片(time span),该线程才被重新唤醒,不过由于线程调度等原因,实际休眠实际可能比sleep_duration所表示的时间片更长
#include <thread>
int mfunction(const char *name, bool flag)
{
    int i = 0;
    while (i < 5)
    {
        std::cout << __func__ << ":" << name << " @thread " << this_thread::get_id() << endl;
        Sleep(1000);
        i++;
    }

    return flag;
}

int main(int, char **)
{
    std::cout << "======boot======" << endl;
    std::cout << "i am main thread:" << this_thread::get_id() << endl;

    thread *th1 = new thread(mfunction, "zhuangjuan", true); //创建线程,并立刻执行传入的函数.

    if (th1->joinable())
        th1->join(); //阻塞当前线程,直到th1线程执行完毕
    std::cout << "======over======" << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

注意事项

  • 线程实在thread对象被定义的时候开始执行的,而不是在调用join函数时才执行的,调用join函数只是阻塞等待线程结束并回收资源。
  • 分离的线程(执行过detach的线程)会在调用它的线程结束或者自己结束时释放资源。
  • 线程会在函数允许完毕后自动释放,不推荐利用其他方法强制结束线程,可能会因资源未释放而导致内存泄漏。
  • 没有执行join或detach的线程在程序结束时会引发异常。

2 std::async

std::async定义在future头文件中。

thread可以快速、方便的创建线程,但在async面前,就是小巫见大巫了。async可以根据情况选择同步执行或创建新线程来异步执行,当然也可以手动选择。对于async的返回值操作也比thread更加方便。

int mfunction(const char *name, bool flag)
{
    int i = 0;
    while (i < 5)
    {
        std::cout << __func__ << ":" << name << " @thread " << this_thread::get_id() << endl;
        Sleep(1000);
        i++;
    }

    return flag;
}

void yfunction(const char *name)
{
    int i = 0;
    while (i < 5)
    {
        std::cout << __func__ << ":" << name << " @thread " << this_thread::get_id() << endl;
        Sleep(1000);
        i++;
    }
}

int main(int, char **)
{
    std::cout << "========boot=======" << endl;

    //第一个参数表示执行方法的类型
    //第二个参数表示方法名
    //后面是调用方法的参数
    //并且由future类型参数接收返回值
    std::future<int> fu = std::async(std::launch::async, mfunction, "hello world!!!", true);
    int ret = fu.get();//该方法阻塞直到异步方法执行完,并且返回异步方法的返回值
    std::cout << "ret:" << ret << endl;
    
    //该异步方法返回值类型为void
    std::future<void> fut = std::async(std::launch::async, yfunction, "hello world!!!");
    fut.wait();//调用wait方法阻塞知道异步方法执行完.
    std::cout << "========over=======" << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

注意,如果需要执行的方法是一个成员函数,或者需要执行的方法中有引用参数,那么处理方法和thread是一样的。thread的处理方法见:stdref和stdcref_目标:MVP-CSDN博客

typedef struct
{
    int mfunction(const char *name, bool flag)
    {
        int i = 0;
        while (i < 5)
        {
            std::cout << __func__ << ":" << name << " @thread " << this_thread::get_id() << endl;
            Sleep(1000);
            i++;
        }

        return flag;
    }

    void yfunction(const char *name)
    {
        int i = 0;
        while (i < 5)
        {
            std::cout << __func__ << ":" << name << " @thread " << this_thread::get_id() << endl;
            Sleep(1000);
            i++;
        }
    }

    void sfunction(int &num)
    {
        num += 100;
    }
} foo;

int main(int, char **)
{
    std::cout << "========boot=======" << endl;
    foo f;
    //第一个参数表示执行方法的类型
    //第二个参数表示方法名
    //后面是调用方法的参数
    //并且由future类型参数接收返回值
    std::future<int> fu = std::async(std::launch::async, foo::mfunction, &f, "hello world!!!", true);
    int ret = fu.get(); //该方法阻塞直到异步方法执行完,并且返回异步方法的返回值
    std::cout << "ret:" << ret << endl;

    //该异步方法返回值类型为void
    std::future<void> fut = std::async(std::launch::async, foo::yfunction, &f, "hello world!!!");
    fut.wait(); //调用wait方法阻塞知道异步方法执行完.

    int a = 10;
    std::future<void> fut = std::async(std::launch::async, foo::sfunction, &f, std::ref(a));
    fut.wait(); //调用wait方法阻塞知道异步方法执行完.

    std::cout << "========over=======" << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1014148
推荐阅读
相关标签
  

闽ICP备14008679号