C++11引入了最新的thread模块,在对线程的操作上进行了进一步的提升,这里设置全局变量number = 1;
int Thread_A() { while (number < 100) { //mu.lock(); //同步数据锁 cout << "thread A :" << number << endl; number++; this_thread::sleep_for(chrono::milliseconds(100)); //mu.unlock(); //解除锁定 } return 0; } int Thread_B() { while (number < 100) { //mu.lock(); //同步数据锁 cout << "thread B :" << number << endl; number++; this_thread::sleep_for(chrono::milliseconds(100)); //mu.unlock(); //同步数据锁 } return 0; }
上方构建了两个函数,分别代表线程A和线程B,分别使用join()方法,这会出现堵塞主线线程和线程访问变量出现问题
int main() { thread a(Thread_A); thread b(Thread_B); a.join(); b.join(); for (int i = 0; i < 10; i++) { cout << "Main thread is working !" << endl; this_thread::sleep_for(chrono::milliseconds(200)); } return 0; }
此时会出现问题,就是当A线程访问number时候,number已经进行赋值输出但是没有进行++操作的时候线程B访问number变量,这会出现其输出变量与A输出的是一样的,而且++进行两次后A线程输出的number+2了,正如下方的运行
所以为了避免出现该问题需要加上同步锁,也就是上方注释部分此时出现比较完美的结局
但是这个时候又有个问题,join方法会对主线程进行堵塞,所以我们需要用
a.detach(); b.detach();
但是会报错,mutex destroyed while busy,此时是由于线程访问未解锁的number报错。