ThreadNote

C++11 之前

#include <pthread.h>
pthread_create (thread, attr, start_routine, arg)

参数

说明

thread

子例程返回的新线程的不透明的唯一标识符。

attr

一个opaque属性对象,可用于设置线程属性。您可以指定线程属性对象,或者为默认值指定NULL。

start_routine

线程创建后将执行的C ++例程。

arg

可以传递给start_routine的单个参数。它必须通过引用传递为void类型的指针转换。如果不传递参数,则可以使用NULL。

C++11

#include <thread>
std::thread nth(&ctr::Class::func, this);        // 创建运行对象成员函数的线程
std::thread nth(func, "HELLO");

构造函数

构造函数

说明

备注

thread() noexcept;

默认构造函数

创建空的std::thread执行对象

template explicit thread (Fn&& fn, Args&&... args);

初始化

创建std::thread对象,该对象可被joinable,信产生的线程会调用fn函数,该函数的参数由args给出

thread (const thread&) = delete;

拷贝构造(被禁用 - delete)

意味着std::thread对象不可被拷贝

thread (thread&& x) noexcept;

移动构造

调用成功之后x不代表任何std::thread执行对象

Example

赋值操作

赋值

说明

备注

thread& operator=(thread&& rhs) noexcept;

Move 赋值操作

如果当前对象不可 joinable,需要传递一个右值引用(rhs)给 move 赋值操作;如果当前对象可被 joinable,则会调用 terminate() 报错。

thread& operator=(const thread&) = delete;

拷贝赋值操作 [deleted]

被禁用,因此 std::thread 对象不可拷贝赋值。

其他成员函数

  • get_id():获取线程ID

  • joinable():检查线程是否可被join

    • 检查当前的线程对象是否表示了一个活动的执行线程,由默认构造函数创建的线程是不能被 join 的

    • 如果某个线程 已经执行完任务,但是没有被 join 的话,该线程依然会被认为是一个活动的执行线程,因此也是可以被 join 的

  • detach:将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。

  • swap:交换两个线程对象所代表的底层句柄(underlying handles)

  • native_handle:返回 native handle

终止线程

  • 向线程发送终止信号,并不能立即终止线程运行,只有在线程运行到检查点时,才会终止。

std::this_thread

  • get_id()

    • std::this_thread::get_id()

  • sleep_for()

    • std::this_thread::sleep_for(std::chrono::seconds(1))

    • 线程休眠某个指定的时间片

  • yield()

    • std::this_thread::yield

    • 放弃当前线程执行

  • sleep_until()

    • 线程休眠至某个指定的时刻,该线程才被重新唤醒

  • sleep_for

Examples

主线程早于子线程退出

  • 子线程会被迫终止

线程作为方法参数

判断线程是否有效

  • 可以通过joinable方法判断线程对象有没有被初始化

PS

  • std::thread::native_handle() 函数只有在调用join()detach()之前有效,之后调用会返回 0,如果此时再调用 pthread_cancel() 传入返回值,试图这样来结束改进程(由于返回值是0,并不能结束该线程),会产生core dump

线程+lambda

参考

编译

最后更新于

这有帮助吗?