C++11语言本身支持了多线程。在以往,linux和windows下创建线程的方式是不一样的,这也就降低了程序的可移植性和可读性。
以前对多前程的了解不多,最近在看一些C++11的新特性,看到多线程这里,故做以记录。
创建线程的两种方式:
1.线程的入口必须是一个函数,那么就可以用函数的方式:
1)导入线程库函数:#include<Thread>
2)使用Thread mytobj(printf)创建一个线程。printf是函数名,也就是线程的入口地址
1 //自己创建的线程也要从一个函数开始执行 2 void mythread() { 3 cout << "这是我创建的线程1" << endl; 4 cout << "这是我创建的线程2" << endl; 5 cout << "这是我创建的线程3" << endl; 6 cout << "这是我创建的线程4" << endl; 7 cout << "这是我创建的线程5" << endl; 8 cout << "这是我创建的线程6" << endl; 9 cout << "这是我创建的线程7" << endl; 10 cout << "这是我创建的线程8" << endl; 11 cout << "这是我创建的线程9" << endl; 12 } 13 int main() //主线程 14 { 15 //创建一个线程 16 thread mytobj(mythread); 17 if (mytobj.joinable()) 18 { 19 cout << "现在可以detach或者join:1" << endl; 20 } 21 else 22 { 23 cout << "现在不能detach或者join:1" << endl; 24 } 25 mytobj.join(); 26 //mytobj.detach(); 27 if (mytobj.joinable()) 28 { 29 cout << "现在可以detach或者join:2" << endl; 30 } 31 else 32 { 33 cout << "现在不能detach或者join:2" << endl; 34 } 35 }
2.使用类对象来创建线程
1 //使用类对象来创建线程 2 int data = 10; 3 char a = 'a'; 4 char *p = &a; 5 std::string str = "you are pretty good!!!!!!!!!!!!!!!"; 6 CreatThreadClass ctc(data,p); 7 thread mytobj(ctc); 8 if (mytobj.joinable()) 9 { 10 cout << "现在可以创建一个线程1" << endl; 11 } 12 else 13 { 14 cout << "现在不能创建一个线程1" << endl; 15 } 16 mytobj.detach(); 17 18 if (mytobj.joinable()) 19 { 20 cout << "现在可以创建一个线程2" << endl; 21 } 22 else 23 { 24 cout << "现在不能创建一个线程2" << endl; 25 } 26 std::string str222 = GetIns::getinstance()->lastFunc(str); 27 cout << str222 << endl; 28 }
使用类对象来创建线程,必要要重载()运算符,在这个重载函数中,调用其他的函数。
1 void operator()(){ 2 3 //TODO 4 }