全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1210
推到 Plurk!
推到 Facebook!

如何用Critical_Section與Mutex來防制多緒下的重入問題

尚未結案
Fm
初階會員


發表:19
回覆:66
積分:37
註冊:2003-10-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-20 13:27:54 IP:220.130.xxx.xxx 未訂閱
大家好 大家好,,因工作需求要多緒程式的實作,,看了版上大家的討論 可以用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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-31 18:07:55 IP:220.130.xxx.xxx 未訂閱
cs 變數是由兩個 threads share 的嗎?
yyu10
中階會員


發表:9
回覆:99
積分:96
註冊:2005-02-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-31 19:38:50 IP:220.244.xxx.xxx 未訂閱
作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
系統時間:2024-05-19 19:21:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!