前言
在前一篇文章中可以实现简单的线程创建,但是会出现一个问题就是,在cout
打印输出的时候会出现莫名其妙的乱序。
void fun(){
cout << "this_thread::id = " << this_thread::get_id() << endl;
}
int main() {
vector<thread> vec;
for (int i = 0; i < 100; ++i) {
thread t(fun);
vec.push_back(move(t));
}
for (int i = 0; i < 100; ++i) {
vec[i].join();
}
}
我想建立100个线程然后每个线程独立输出一行数据,但是结果并不是我想的那样。
发现有一些行出现了混乱,这是因为在cout
的过程中,多个线程同时执行cout
导致最终这个输出的结果就是很多个cout
拼凑在一起的结果。但是怎么来解决这个问题呢,这就是这一部分需要讲的问题。
互斥元保护数据
可以通过增加一个互斥元来保护cout
过程,让他每一次都能够完整实现一次cout
过程。
互斥元
互斥元通过metex
来进行创建,需要包含头文件<mutex>
,通常只有两个函数以供调用。
lock()
:阻塞的对互斥元进行锁定,如果锁定不成功则一直阻塞;unlock()
:对线程进行解锁。
我们就来加上互斥元来看一下结果。
mutex mu;
void fun()