文章目录
前言
多线程6:线程间的同步机制1
一、线程同步的必要性
C/C++会先被转化为汇编,然后转化为二进制代码,再被CPU执行。在进行多线程的时候,如果多个线程同时去访问一个全局变量,而其中某一个线程正在修改全局变量的值,那么CPU进行线程的调度的时候,可能会让该线程停止运行,让另一个线程先去运行。那么这个另一个线程也要去修改全局变量的值的话就可能会存在问题:多个线程都需要去修改这个全局变量,就可能会造成冲突。举个例子来说就像公共设施一样,某个公共设施同一时间只能让一个人使用,那么其他人看到这个公共设施已经有人使用的时候就会排队等候,当没有人使用的时候再去按顺序使用。在多线程中,线程1在修改全局变量的时候,其他线程应该等候,等线程1修改完毕之后,其他线程再来修改,其他线程在等候的时候可以去进行其他的操作或运算。说白了就是当某一个东西大家都要使用的时候,要按照规则依次使用,否则就会发生混乱。
二、没进行多线程同步的异常现象
对于某个全局的数值变量来说,一般不会对程序造成异常,但是会导致数值不准确。如果对于某一个类对象的成员变量,可能会引起程序的异常或者一些不确定的错误。
1.全局的数值变量
这里新创建一个MFC工程,并在主对话框上新建一个按钮1,命名为“没进行多线程同步的异常现象(全局的数值变量)”,并添加其点击消息响应函数
按钮1的点击响应函数和子线程函数如下
//没进行多线程同步的异常现象--------------------------------------------
int g_Num = 0;
UINT __cdecl ThreadProc1(LPVOID lpParameter)
{
for (int idx = 0; idx < 100; idx++)
{
g_Num = g_Num + 1;
CString str;
str.Format(_T("%d"), g_Num);
g_Num = g_Num - 1;
}
}