40.C++11多线程
Posted 干锅土鸡
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了40.C++11多线程相关的知识,希望对你有一定的参考价值。
语言级别的多线程=》代码跨平台 Windows、linux、macos
thread/mutex/condition_variable
atomic原子类型,基于CAS操作的原子类型(线程安全)
sleep_for
本质上都是在调用系统的API
一、如何创建启动线程?
std::thread定义一个线程对象,传入线程所需要的线程函数和参数,线程自动开启!
void threadHandler(int time)
std::this_thread::sleep_for(std::chrono::seconds(time));//子线程睡眠两秒
cout << "hello thread1!" << endl;
int main()
//创建了一个线程对象,传入一个线程函数,新线程(函数)就开始运行了
std::thread t1(threadHandler1,2);
//主线程等待子线程结束,主线程继续往下运行
t1.join();
cout << "main thread done!" << endl;
//把子线程设置为分离线程
//主线程和子线程没关系了,子线程运行完毕与否,与主线程无关
//主线程运行完成,查看如果当前进程还有未运行完成的子线程,进程就会异常终止
t1.detach();
二、子线程如何结束?
子线程函数运行完成,线程就结束了
三、主线程如何处理子线程
join:等待某线程结束,当前线程继续往下运行
detach:把当前子线程设置为分离线程,主线程结束,整个进程结束,所有子线程都自动结束了!
竞态条件:多线程执行的结果是一致的,不会随着cpu对线程不同的调用顺序,而产生不同的运行结果。
int ticketCount=100;
void sellTicket(int index)
while(ticketCount > 0)
//cout << "窗口:" << index << "" << ticketCount << "张票!" << endl;
cout << ticketCount << endl;
ticketCount--;
std::this_thread::sleep_for(std::chrono::milliseconds(100));
int main()
list<std::thread> tlist;
for(int i=1;i<=3;++i)
tlist.push_back(std::thread(sellTicket,i));
for(std::thread& t : tlist)
t.join();
cout << "所有窗口买票结束!" << endl;
return 0;
上述程序运行可能出现多次相同的数字!为什么?
可能执行一个汇编语句,时间片就到了,去执行其他的线程语句了!
解决方法,加锁:
锁内的区域叫:临界区代码段
以上是关于40.C++11多线程的主要内容,如果未能解决你的问题,请参考以下文章