自学内容网 自学内容网

(c++)线程的创建、互斥锁的使用、线程数组

 1.创建10个线程,每个线程都做10万次全局变量num1++操作,然后输出这个全局变量,预想结果应该是100万。但是线程可能在cpu分配的一个时间片中做不完10万次+1的操作,这时候cpu会被其他线程抢占,由于num1++不是一个原子操作(操作过程中可能会发生中断),导致++其实没有做完,所以num1的最终结果会小于100万。

2.创建10个线程,每个线程都做10万次全局变量num2++操作,与前者不同的是,这次对num2++操作加入互斥锁,也就是让num2++成为一个“原子操作”(操作过程不会被中断),所以结果符合预期为100万

#include<iostream>
#include<thread>//使用thread包含这个库
#include<mutex>//使用互斥锁包含这个库

using namespace std;//不加这个的话每个标识符前都要添加 std:: 才能用

mutex mtx2;//用来给num2++的操作加互斥锁

//两个全局变量用于做累加操作
int num1 = 0;
int num2 = 0;


void increase1()//让全局变量num1累加100000次
{
for (int i = 0; i < 100000; i++)
{
num1++;
}
}
void increase2()//让全局变量num2累加100000次
{
for (int i = 0; i < 100000; i++)
{
mtx2.lock();
num2++;
mtx2.unlock();
}
}


int main()
{

//创建10个进程并调用函数increase1,每个进程让全局变量num1++100000次
thread t1(increase1);
thread t2(increase1);
thread t3(increase1);
thread t4(increase1);
thread t5(increase1);
thread t6(increase1);
thread t7(increase1);
thread t8(increase1);
thread t9(increase1);
thread t10(increase1);

//等待这10个线程执行完,不然下方的输出会提前输出num1=。。。
t1.join();
t2.join();
t3.join();
t4.join();
t5.join(); 
t6.join();
t7.join(); 
t8.join();
t9.join();
t10.join();

cout << "预期结果小于100万,未加锁num1=" << num1 << endl;
/*预期结果小于100万,因为num1++不是原子操作,
 线程运行到一半会被其他线程抢占cpu导致++没做完
 */

//创建10个进程并调用函数increase2,每个进程让全局变量num2++100000次
thread t11(increase2);
thread t12(increase2);
thread t13(increase2);
thread t14(increase2);
thread t15(increase2);
thread t16(increase2);
thread t17(increase2);
thread t18(increase2);
thread t19(increase2);
thread t20(increase2);
    //等待这10个线程执行完,不然下方的输出会提前输出num2=。。。
t11.join();
t12.join();
t13.join();
t14.join();
t15.join();
t16.join();
t17.join();
t18.join();
t19.join();
t20.join();
cout << "预期结果100万,加锁num2=" << num2 << endl;
//预期结果100万,由于加了锁,num2++不会被中断

system("pause");
return 0;
}

运行结果

 创建线程也可以用线程数组

#include<iostream>
#include<thread>
using namespace std;
int n = 0;

void increase() //n累加1000万次
{
for (int i = 0; i < 10000000; i++)
{
n++;
}

}

int main()
{
//创建一个有10个元素的线程数组
thread my_thread[10];

//启动10个线程,让每个线程调用increase函数
for (int i = 0; i < 10; i++)
{
my_thread[i]=thread(increase);
}

//等待这10个线程执行完
for (int i = 0; i < 10; i++)
{
my_thread[i].join();
}
//结果会小于1亿
cout << "全局变量n=" << n << endl;

system("pause");
return 0;
}

运行结果(每次都可能不一样)

 

同样的,也可以给n++加互斥锁,这样预期结果就会是1亿


原文地址:https://blog.csdn.net/weixin_53112343/article/details/142399013

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!