赞
踩
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; }
注意事项
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; }
注意,如果需要执行的方法是一个成员函数,或者需要执行的方法中有引用参数,那么处理方法和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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。