线程基本知识
- 多线程库:#include
- join():加入、汇合线程,阻塞主线程;
- detach():分离,驻留后台;
- 注意点:对于同一个线程而言,join()和detach()只能做一次
创建线程的方式
- 普通函数充当线程处理函数;
void print_1()
{
cout<<"俺是一个线程"<<endl;
}
//测试函数,记得在主函数中调用
void test_1()
{
thread t1(print_1);
t1.join();
}
- 采用纳母达表达式充当线程处理函数;
void test_2()
{
thread t1([](){cout<<"纳母达表达式充当线程处理函数";});
t1.join();
}
- 带参函数创建线程
3.1 普通函数带参函数
3.2 以引用作为函数参数的函数
3.3 智能指针充当函数参数
void print_2(int num)
{
cout<<"id: "<<num<<endl;
}
void test_3()
{
int num=1213;
thread t1(print_2,num);
t1.join();
}
void print_3(int& num)
{
num=1314;
cout<<"id: "<<num<<endl;
}
void test_4()
{
int num=0;
thread t1(print_3,ref(num));
//ref:包装引用作为传递的值,不包装会报错,invoke:未找到匹配的重载函数
t1.join();
cout<<"主线程:"<<num<<endl;
}
void print_4(unique_ptr<int>ptr)
{
cout<<"智能指针:"<<*ptr.get()<<endl;
}
void test_5()
{
unique_ptr<int>ptr(new int(999));
cout<<"intelligence:"<<*ptr.get()<<endl;
thread t1(print_4,move(ptr));
//move函数作用是移交权限
cout<<"intelligence:"<<*ptr.get()<<endl;
//权限移交移交,此时打印ptr的值,为空或者其他超大超小数字
- 类中成员函数作为线程处理函数,仿函数形式:类名的方式调用
class Function
{
public:
void operator()()
{
cout<<"重载()号"<<endl;
}
};
void test_6()
{
//传对象
Function object;
thread t1(object);
t1.join();
//传匿名对象
thread t2((Function()));
t2.join();
- 普通类中的成员函数
class Common
{
public:
void print(int& id)
{
cout<<"id: "<<id<<endl;
}
};
void test_7()
{
Common com;
int id=1213;
thread t1(&Common::print,com,ref(id));
t1.join();
}
结语
- 以上就是我所学习到线程创建的方式,如有错误或缺省,还请小伙伴不吝赐教;
版权声明:本文为qq_46282869原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。