#include<thread>
#include<iostream>
using namespace std;
void output(int i)
{
cout<<i<<endl;
}
int main()
{
for(unit8_t i=0;i<4;i++)
{
thread t(output,i);
t.detach();
}
getchar();
return 0;
}
join
#include<thread>
#include<iostream>
using namesapce std;
void show(
cout<<"hello ";
}
int main()
{
array<thread,3> threads={ thread(show),thread(show),thread(show) };
for(int i=0;i<3;i++)
{
cout<<threads[i]=join.joinable()<<endl;//判断是否可以join
join 是让当前主线程等待所有的子线程执行完,才能退出。
threads[i].join();
}
return 0;
}
detach
#include<thread>
using namespace std;
void show(){
{
cout<<"hello"<<endl;
}
int main()
{
thread th(show);
th.detach();
脱离主线程的绑定,主线程挂了。子线程不报错。子线程执行完自动退出。
cout<<th.joionable()<<endl;
return 0;
}
获取cpu的核心个数
#include<thread>
using namespace std;
int main()
{
auto n=thread::hardware_concurrency();获取cpu的核数
cout<<n<<endl;
return 0;
}
线程之间的安全:
#include<thread>
using namespace std;
const int N=100000000;
int num=0;
void run()
{
for(int i=0;i<N;i++)
{
num++;
}
}
int main()
{
clock_t start =clock();clock()是c++的计时函数。
相关的数据类型是clock()_t,简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。
thread t1(run);
thread t2(run);
t1.join();
t2.join();
clock_t end=clock();
return 0;
}
#include<mutex>
#include<thread>
using namespace std;
const inthn N=1000000;
int num(0);
mutex m;
void run(){
for(int i=0;i<N;i++0
{
m.lock();
num++;
m.unlock();
}
}
int main()
{
clock_ start=clock();
thread t1(run);
thread t2(run);
t1.join();
t2.join();
clock_t end=clock();
return 0;
}
num=200000000,用时 128323 ms</span>
耗时很长
原因是互斥加锁需要时间
原子变量
#include<thread>
#include<atomic>
using namespace std;
const int N=100000000;
atomic_int num{0};不会发生线程冲突,线程安全
void run()
{
for(int i=0;i<N;i++)
{
num++;
}
}
int main()
{
clock_t start=clock();
thread t1(run);
thread t2(run);
t1.join();
t2.join();
clock_t end=clock();
return 0;
}
不难发现,通过原子变量后运算结果正确,计算速度一般。
原子变量详细内容 请参考C++11 并发之std::atomic。
#include<thread>
usingnamespace std;
constint N = 100000000;
int num = 0;
void run()
{
for (int i = 0; i < N; i++)
{
num++;
}
}
int main()
{
clock_t start = clock();
thread t1(run);
t1.join();
thread t2(run);
t2.join();
clock_t end = clock();
cout <<"num=" << num <<",用时 " << end - start <<" ms" << endl;
return 0;
}
运行结果:
num=200000000,用时 626 ms</span>
不难发现,通过原子变量后运算结果正确,计算速度也很理想。
lambda
#include<thread>
using namespace std;
int main()
{
auto fun=[](const char *str){cout<<str<<endl;
}
thread t1(fun,"hello");
thread t2(fun,"hello you");
return 0;
}
时间等待相关问题:
#include<thread>
#include<chrono>
using namespace std;
int mian()
{
thread th1([]()
{
this_thread::sleep_for(chrono::seconds(3));
this_thread::yield();//这和函数让线程放弃时间片
cout<<this_thread::get_id()<<endl;//输出线程id
}
线程功能扩展
#include<thread>
using namespace std;
class MYThread:public thread
{
public:
template<typename T,typename ...Args>
void showcmd(const char *str)
{
system(str);
}
};
int main()
{
MYThread th1([]()
{
cout<<"hello"<<endl;
});
th1.showcmd("calc");
MyThread th2([](const char*str)
{
cout<<"hello<<str<<endl;
},"this is MyThread");
th2.showcmd("notepad:);
return 0;
}
hello
//运行calc
hellothis is MyThread
//运行notepad</span>
多线程的可变参数
#include<thread>
#include<cstdarg>
using namespace std;
int show(const char &fun,...)
{
va_list ap;
va_start(ap,fun);
vprintf(fun,ap);
va_end(ap);
return 0;
}
int main()
{
thread t1(show,"%s %d %c %f,"hello world!", 100,'A', 3.14159);
return 0;
}
运行结果:
hello world! 100 A 3.14159</span>
线程交换
#include<thread>
usingnamespace std;
int main()
{
thread t1([]()
{
cout <<"thread1" << endl;
});
thread t2([]()
{
cout <<"thread2" << endl;
});
cout <<"thread1' id is " << t1.get_id() << endl;
cout <<"thread2' id is " << t2.get_id() << endl;
cout <<"swap after:" << endl;
swap(t1, t2);//线程交换
cout <<"thread1' id is " << t1.get_id() << endl;
cout <<"thread2' id is " << t2.get_id() << endl;
return 0;
}
运行结果:
thread1
thread2
thread1' id is 4836
thread2' id is 4724
swap after:
thread1' id is 4724
thread2' id is 4836</span>
线程移动
#include<thread>
usingnamespace std;
int main()
{
thread t1([]()
{
cout <<"thread1" << endl;
});
cout <<"thread1' id is " << t1.get_id() << endl;
thread t2 = move(t1);;
cout <<"thread2' id is " << t2.get_id() << endl;
return 0;
}
运行结果:
thread1
thread1' id is 5620
thread2' id is 5620</span>
从上述代码中,线程t2可以通过 move 移动 t1 来获取 t1 的全部属性,而 t1 却销毁了。