【C++11多线程】
标签:
std::thread
std::mutex
std::atomic
std::conditional_varible
我们对比单线程和多线程的时间性能:
我们用 Sleep(5000) 函数让程序休眠 5 秒用来模拟函数执行了一系列耗时的操作
接下来我们分别用 单线程 和 多线程 来调用这两个函数,对比执行的时间:
1.单线程串行执行
2.多线程并行执行
可以看到用单线程执行 func1() 和 func2() 共耗时 10 秒,是 func1() 和 func2() 单独执行的时间总和,而用多线程执行完2个函数总共耗时 5 秒,因为他们是并行同时执行的,并不是 func1() 执行完才执行 func2() 而是 func1() 和 func2() 同时执行的
上面我们假设 func1() 和 func2() 是毫无关系的两个独立逻辑的函数,如果我们的两个函数要进行共享数据,就不能像单线程一样随意对共有变量进行赋值,因为2个线程同时对一块内存进行写入程序就会崩溃,此时就要用到锁:std::mutex
假设你正乘坐通宵列车旅行。一个可以确保你在正确的车站下车的方法就是整夜保持清醒并注意火车停靠的地方。你不会误站,但你到那儿时就会觉得很累。或者,你可以查一下时间表,了解火车会在何时到达,将闹钟定的稍微提前一点,然后去睡觉。这是可以的;你不会错过站,但是如果火车晚点了,你就会醒的太早。也有可能闹钟的电池没电了,你就会睡过头以至于错过站。理想的状况是,你只管去睡觉,让某个人或某个东西在火车到站时叫醒你,无论何时。
上面我们就用了最笨的第一种方法,在while(true)里不停的访问共享队列查看是否有数据,如果有就取出,如果没有就继续查看,这种方法的弊端是如果长时间没有数据,消费者就会不停的访问空队列,极大的浪费CPU,下面我们用std::conditional_varble让消费者在没有数据的时候休眠线程,让CPU去处理别的事情,当有数据时主动唤醒线程去取数据