进程
进程就是一个正在执行程序的实例。
- 运行态
- 就绪态
- 阻塞态
线程API
1.1 std
#include <iostream> // std::cout
#include <thread> // std::thread
void foo() {
// do stuff...
}
void bar(int x){
// do stuff...
}
int main() {
std::thread first (foo);
return 0;
}
- get_id() 获得线程ID。
- joinable() 检查是否可执行。
- join() 等待线程结束。
- detach() 分离线程,使其变成一个独立的线程,分离线程为守护线程(daemon threads)。
- swap() 交换两个线程的状态。
- native_handle()
- hardware_concurrency()这个函数将返回能同时并发在一个程序中的线程数量。
1.2 pthread
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(start_routine)(void *), void *arg);
- thread是一个输出参数,线程创建成功的话可以得到线程的ID。
- pthread_t pthread_self(void); Linux中获得线程ID。
1.3 获得线程ID的方式
- pthread_create()
- pthread_self()
- syacall(SYS_gettid)
线程管理
- 使用一个能访问局部变量的函数去创建线程是一个糟糕的主意,可能会出现函数已经结束,线程依旧访问局部变量。
- 当倾向于在无异常的情况下使用join()时,需要在异常处理过程中调用join(),从而避免生命周期的问题。
- 使用RAII(资源获取即初始化方式)能有效避免一些问题。
- 向线程函数传递参数时要注意:std::thread的构造函数只会复制提供的变量。成功的情况是,复制一个引用。在线程更新数据结构时,会成功的传递一个引用。
转移线程所有权
- std::thread都是可移动(movable),但不可拷贝(cpoyable)。