如何用Critical_Section與Mutex來防制多緒下的重入問題 |
尚未結案
|
Fm
初階會員 發表:19 回覆:66 積分:37 註冊:2003-10-15 發送簡訊給我 |
大家好
大家好,,因工作需求要多緒程式的實作,,看了版上大家的討論
可以用Critical_Section or Mutex來達到需求..
於是我試改了了"lu"版主的的程式來看這兩者有何差異
觀看結果我會得到說Critical Section並無真正達到保護的作用(我很困惑)..
這讓我蠻困惑的..,,請問這應該怎麼解釋
程式
//--------------------------------------------------------------------------- __fastcall TMyThread::TMyThread (HANDLE ttHandle,unsigned int *ttNum,bool AddFlag) : TThread(true) { FAddFlag = AddFlag; Num = ttNum; FormHandle = ttHandle; OperationMutex = CreateMutex (NULL,false,"Test Program MyThread Version 1"); InitializeCriticalSection(&cs); //InitializeCriticalSection(&cs[1]); } //--------------------------------------------------------------------------- void __fastcall TMyThread::Execute() { int c; // EnterCriticalSection(&cs); for (c=0;c<50;c ) { // WaitForSingleObject (OperationMutex,INFINITE);//¸ÕµÛקï¬Ý¬Ýµ²ªG // EnterCriticalSection(&cs); if (FAddFlag) { EnterCriticalSection(&cs); *Num = *Num 1; LeaveCriticalSection(&cs); } else { EnterCriticalSection(&cs); *Num = *Num - 1; LeaveCriticalSection(&cs); } Sleep (10); //¸ÕµÛקï¬Ý¬Ýµ²ªG // LeaveCriticalSection(&cs); // ReleaseMutex (OperationMutex); //¸ÕµÛקï¬Ý¬Ýµ²ªG PostMessage (FormHandle,WM_USER 100 , 0,FAddFlag); } // LeaveCriticalSection(&cs); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { Num = 0; Memo1->Clear (); MyThread1->Resume (); MyThread2->Resume (); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { MyThread1 = new TMyThread (this->Handle,&Num,true); //add MyThread2 = new TMyThread (this->Handle,&Num,false);//minus } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { MyThread1->WaitFor (); delete MyThread1; MyThread2->WaitFor (); delete MyThread2; } //--------------------------------------------------------------------------- void __fastcall TForm1::ShowNumber(TMessage Msg) { String ss = "Number:" (String)Num ", " (String)Msg.LParam ; Memo1->Lines->Add (ss); } //---------------------------------------------------------------------------結果如下: 用Mutex的結果 Number:1, 1 Number:0, 0 Number:1, 1 Number:1, 0 Number:1, 1 Number:0, 0 Number:1, 1 Number:0, 0 Number:1, 1 Number:0, 0 Number:1, 1 Number:0, 0 Number:0, 1 Number:0, 0 用CriticalSection的結果 Number:0, 0 Number:0, 1 Number:0, 1 Number:0, 0 Number:0, 0 Number:4294967295, 1 Number:0, 0 Number:0, 1 Number:0, 1 Number:0, 0 Number:0, 0 //-------- 因為出現紅色的那些訊息,,讓我感到困惑 //-------------------- Begin with the end in mind. 發表人 - Fm 於 2005/03/20 13:29:57 |
yhchu
一般會員 發表:2 回覆:70 積分:24 註冊:2004-01-28 發送簡訊給我 |
|
yyu10
中階會員 發表:9 回覆:99 積分:96 註冊:2005-02-18 發送簡訊給我 |
作minus的绪连续执行了两次, 使Num成为负值, 即-1. -1的二进制表示为0xFFFFFFFF, 也就是你看到的 4294967295. 改动一下Num的初始值, 就可以看到CriticalSection还是有效的.
void __fastcall TForm1::Button1Click(TObject *Sender) { Num = 1000; Memo1->Clear (); MyThread1->Resume (); MyThread2->Resume (); }_________________________ Programming is a passion |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |