std::thread::get_id
id get_id() const noexcept;
返回线程ID
If the thread object is joinable, the function returns a value that uniquely identifies the thread.如果线程对象是joinable的,那么将会返回一个独一无二的线程标识。(这里我试了几个例子,还是搞不太明白,还是先保留该问题。看最后一个的例子)
例子:
#include <iostream>
#include <thread>
using namespace std;
void show(int n){
cout<<"show1:get_id() is "<<this_thread::get_id()<<",Now n is "<<n<<endl;
}
void show2(int n){
cout<<"show2:get_id() is "<<this_thread::get_id()<<",Now n is "<<n<<endl;
}
int main()
{
cout<<"main starts"<<endl;
cout<<"mainThread is "<<this_thread::get_id()<<endl;
thread t2(show,10);
cout<<"t2 is "<<t2.get_id()<<endl;
t2.join();
cout<<"after t2.join(),t2 is "<<t2.get_id()<<endl;
thread t3(show2,99);
cout<<"t3 is "<<t3.get_id()<<endl;
t3.detach();
cout<<"after t3.detach(),t3 is "<<t3.get_id()<<endl;
cout<<"main complete!"<<endl;
}
运行及GDB调试截图:
可以看到,两个子线程都在main还没结束的时候就已经exited了!并且第一个子线程在第二个子线程还没有构造的时候就已经exited了。
这里的返回值都是一样,换个更好点的例子:
#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
//delay(n) 延时n秒
void delay(double sec)
{
time_t start_time, cur_time; // 变量声明
time(&start_time);
do {
time(&cur_time);
}while((cur_time - start_time) < sec );
};
void show(int n){
cout<<"show1:get_id() is "<<this_thread::get_id()<<",Now n is "<<n<<endl;
delay(3);
cout<<"show1 complete!"<<endl;
}
void show2(int n){
cout<<"show2:get_id() is "<<this_thread::get_id()<<",Now n is "<<n<<endl;
delay(3);
cout<<"show2 complete!"<<endl;
}
int main()
{
cout<<"main starts"<<endl;
cout<<"mainThread is "<<this_thread::get_id()<<endl;
thread t3(show2,99);
cout<<"t3 is "<<t3.get_id()<<endl;
t3.detach();
cout<<"after t3.detach(),t3 is "<<t3.get_id()<<endl;
thread t2(show,10);
cout<<"t2 is "<<t2.get_id()<<endl;
t2.join();
cout<<"after t2.join(),t2 is "<<t2.get_id()<<endl;
cout<<"main complete!"<<endl;
}
运行截图:
可以看到show1和t1的ID是一样的,show2和t3的ID是一样的。(这里显示的有点混乱)
如果线程对象不是joinable,那么将会返回默认构造时的ID。
Parameters
noneReturn value
An object of member type thread::id that uniquely identifies the thread (if joinable), or default-constructed (if not joinable)
返回一个线程id标识。
Example
| |
Output:
This is the main thread.
This is not the main thread.
|
根据example修改的例子:
#include <iostream>
#include <thread>
#include <ctime>
using namespace std;
std::thread::id main_thread_id = std::this_thread::get_id();
void show(int n){
cout<<endl<<"main_thread_id="<<main_thread_id<<endl;
cout<<"thi_thread::get_id="<<this_thread::get_id()<<endl;
cout<<"SHOW complete!"<<endl;
}
int main()
{
cout<<endl<<"Main main_thread_id="<<main_thread_id<<endl;
cout<<"Main this_thread::get_id= "<<this_thread::get_id()<<endl;
show(888);
thread t3(show,99);
cout<<"t3 is "<<t3.get_id()<<endl;
t3.detach();
thread t2(show,10);
cout<<"t2 is "<<t2.get_id()<<endl;
t2.join();
}
结果:
令我疑惑的是在开头那个全局设置
std::thread::id main_thread_id = std::this_thread::get_id();
和在函数中的
this_thread::get_id()
有什么区别?难道是全局的那个肯定是main的,这样就说的过去了,因为和main的返回值是一样的。
个人觉得应该是joinable是我理解有些误差。
Data races
The object is accessed.Exception safety
No-throw guarantee: never throws exceptions.
—————————————————————————————————————————————————————————————————
//写的错误或者不好的地方请多多指导,可以在下面留言或者点击左上方邮件地址给我发邮件,指出我的错误以及不足,以便我修改,更好的分享给大家,谢谢。
转载请注明出处:http://blog.csdn.net/qq844352155
author:天下无双
Email:coderguang@gmail.com
2014-9-4
于GDUT
——————————————————————————————————————————————————————————————————