多线程操作一个全局变量的一致性问题
有一个实验,是用多线程操作一个全局变量。
我们看资料,都知道全局变量在多线程的操作下,应该使用TCriticalSection来保证一次只有一个线程操作它。
我的问题是这样的:
在主单元的h文件里放一个
int a=1;
这样,就是个全局变量。主单元另外一处(保证先执行到)将其赋值成2 :
a=2;
另外一个unit文件,设计一个简单的线程:
在h文件里:
class o2 : public TThread
{
private:
protected:
void __fastcall Execute();
public:
__fastcall o2(bool CreateSuspended);
};
在cpp文件里:
__fastcall o2::o2(bool CreateSuspended)
: TThread(CreateSuspended)
{
CreateSuspended=true;
}
//---------------------------------------------------------------------------
void __fastcall o2::Execute()
{
//---- Place thread code here ----
CS->Acquire();
if(a==2)
a=9;
if(a==1)
a=10;
CS->Release();
}
回到主单元unit1,这样调用这个线程对象:
o2 *oo=new o2(true);
....
void __fastcall TForm1::Button4Click(TObject *Sender)
{
oo->Resume();
if(a==9)
{
ShowMessage("now a=9 ");
};
if(a==10)
{
ShowMessage("now a=10 ");
}
}
//======================
现在的问题是,象这个例子这样使用线程将那个全局变量a进行改变,即使在debug工具里可以看到a=2,但在线程对象oo里,仍然认为它是1。
这是一个有意思的现象。请大侠们指点迷津。应该如何才能保证多线程条件下数据的一致。