初学多线程时,使用unlock()两次导致程序出错。
错误代码:
void liout(){
for (int i = 0; i < 100000; i++) {
mytex.lock();
if (!li.empty()) { //当li不为空时,会执行一次unlock();
int comp=li.front();
li.pop_front();
mytex.unlock();
}
mytex.unlock(); //无论如果这里又执行了一次unlock(),导致程序出错;
return;
}
修改之后:
void liout(){
for (int i = 0; i < 100000; i++) {
mytex.lock();
if (!li.empty()) {
int comp=li.front();
li.pop_front();
mytex.unlock();
}
else {
mytex.unlock(); //只在li为空的时候再unlock();
}
}
return;
}
完整代码:
#include<iostream>
#include<string>
#include<queue>
#include<unordered_map>
#include<set>
#include<thread>
#include<mutex>
using namespace std;
class A{
private:
list<int> li;
mutex mytex;
public:
void liin() {
for (int i = 0; i < 100000; i++) {
cout << "插入一个元素" << i << endl;
mytex.lock();
li.push_back(i);
mytex.unlock();
}
}
void liout(){
for (int i = 0; i < 100000; i++) {
mytex.lock();
if (!li.empty()) {
int comp=li.front();
li.pop_front();
mytex.unlock();
}
else {
mytex.unlock();
}
}
return;
}
};
int main() {
A a;
thread thin(&A::liin, &a);
thread thout(&A::liout, &a);
thin.join();
thout.join();
return 0;
}