不同平台、框架、语言所使用的线程函数不同。对于初学者选择一种适合自己的,用熟用透即可。
Windows中,CreateThread()
Linux中,pthread_create()
MFC框架中,AfxBeginThread()
Qt框架中,QThread类
C++11中,thread类
本文只介绍关于C++11的线程知识:添加 #include<thread>
原则上:主线程需等待子线程执行完毕后再退出。不推荐用detach(),子线程会失去与主线程的关联。
//Win32 控制台应用程序 #include "stdafx.h" #include<iostream> #include<thread> using namespace std; void myprint()//线程函数 { cout << "子线程开始" << endl; cout << "子线程结束" << endl; } int main() { cout << "主线程开始" << endl; thread t(myprint);//创建线程对象t,并执行线程 if (t.joinable()) //判断是否能join { cout << "子线程可以join" << endl; t.join();//阻塞主线程,直到此线程执行完毕 } else { cout << "子线程不可以join" << endl; } cout << "主线程结束" << endl; return 0; }
对【参考】的总结:
1、什么时候需要加锁和解锁?
多线程访问的公共变量,如果只读就没必要加锁解锁。
如果线程会改变这个公共变量,那就加锁解锁。此时推荐使用原子变量。(只允许被一个线程访问,不冲突,也不用写加锁、解锁等代码)
2、多线程调用同一个函数,需要加锁解锁吗?
道理与问题1一样,只读就没必要加锁解锁。
【参考】更详细的内容在参考链接中,值得一看。注意#include<thread>后不需要再引入chrono类,其中已包含。