C++并发编程实战第2版笔记

发布时间:2024年01月09日

P21 在std::thread对象析构前,必须明确是等待还是分离线程

std::thread对象析构前,必须明确,是等待线程完成(join)还是要与之分离(detach)。

如果等待std::thread对象销毁之际还没决定好,那std::thread的析构函数将会调用std::terminate()终止整个程序。

示例代码:

#include <thread>
#include <iostream>

void do_lengthy_work()
{
    std::cerr << __FUNCTION__;
};

int main(void)
{

    {
        std::thread t(do_lengthy_work);
        //t.join()
        //理应在这里join或detach
    }

    while (1)
    {
    }
}

这里我们既不join也不detach,那么就会导致std::terminate()被调用,导致程序终止。
在这里插入图片描述

P25 移动语义

若源对象是临时变量,移动就会自动发生。
若源对象是具名变量,则必须通过调用std::move()直接请求转移。

标准库中有一些类的归属权语义是 是只可移动但不可复制的,如std::threadstd::unique_ptr

P25 将类的成员函数设定为线程函数

class X{
public:
	void do_lengthy_work();
};

X my_x;
std::thread t(&X::do_lengthy_work, &my_x);

若要将某个类的成员函数设定为线程函数,应传入一个函数指针,指向该成员函数。

此外,还要给出合适的对象指针,作为该函数的第一个参数。

文章来源:https://blog.csdn.net/qq_51470638/article/details/135473126
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。