一、c++11多线程的创建
#include <iostream> #include<thread> //包括头文件 #include<unistd.h> using namespace std; void sayHello() { while(1) { sleep(1); cout<<endl<<"hello"<<endl; } } void sayWorld() { while(1) { sleep(1); cout<<endl<<"world"<<endl; } } int main() {
/* 新建线程两个 使用thread 线程名来新建一个线程 并在线程中threadHello调用函数 void sayHello() 并在线程中threadWorld调用函数 void sayWorld()
*/ thread threadHello(&sayHello); thread threadWorld(&sayWorld); threadHello.join(); threadWorld.join(); return 0; }
二、线程的同步(unique_lock的使用)
unique_lock中的unique表示独占所有权。
unique_lock独占的是mutex对象,就是对mutex锁的独占。
用法:
(1)新建一个unique_lock 对象
(2)给对象传入一个std::mutex 对象作为参数;
std::mutex mymutex; unique_lock lock(mymutex);
因此加锁时新建一个对象lock
unique_lock lock(mymutex);
而这个对象生命周期结束后自动解锁。
#include <iostream> #include<thread> #include<unistd.h> #include<mutex> using namespace std; std::mutex mymutex; void sayHello() { int k=0; unique_lock<mutex> lock(mymutex); while(k<2) { k++; cout<<endl<<"hello"<<endl; sleep(2); } } void sayWorld() { unique_lock<mutex> lock(mymutex); while(1) { cout<<endl<<"world"<<endl; sleep(1); } } int main() { thread threadHello(&sayHello); thread threadWorld(&sayWorld); threadHello.join(); threadWorld.join(); return 0; }
程序运行步骤:
首先同时运行threadHello线程和threadWorld线程
先进入threadHello线程的sayHello()函数,这个时候加了mymutex锁,另外一个threadWorld线程进入后发现mymutex锁没有释放,只能等待。
当过去两个循环(每个循环2秒后)threadHello线程结束,unique_lock lock(mymutex)的生命周期结束,mymutex锁释放,执行threadWorld线程,此时开始一直say world。