使用Windows核心對象引起的錯誤(VC++6.0)

來源:互聯網
上載者:User

相關知識:

1。 核心對象主要有:
 存取符號對象、事件對象、檔案對象、檔案對應物件、I/O完成連接埠對象、工作物件、信箱對象、互斥對象、管道對象、進程對象、信標對象、線程對象

2。核心對象的資料結構只能被核心訪問,因此應用程式無法在記憶體中訪問這些資料結構並直接改變它們的內容,必須通過調用Windows介面來對核心對象進行操作。

3。使用核心對象命名可以讓進程給跨越進程邊界訪問, Microsoft沒有提供為核心對象賦予命名的指導原則,所有這些對象都共用單個命名空間。

Real Instance:


using MFC6.0

在一次C++網路編程中,我自訂了一個ExSocket類繼承了CAsyncSocket類,由於發送接收的資料量比較大,我採用了資料緩衝,一個線程負責接收資料並儲存到緩衝中,另外一個線程負責從緩衝中取出資料並處理,在存取緩衝採用CMutex互斥鎖互斥訪問。典型的生產者和消費者的關係:

file ExSocket.h:

class ExSoket: public CAsyncSocket
{
private :
 CMutex *pMutex;//mutex for critical section
 MessageNode *pMessageHead;//Head of data list
 MessageNode *pMessageTail;//Tail of data list
 //other variables

public:
 ExSocket();//the constructor
 //other functions
}

file ExSocket.cpp:

ExSocket::ExSocket()
{
 //initialization of the class
 pMutex=new CMutex(FALSE,"ExSocketMutex");
}
//other definition of the functions

 當我寫完這個類後,在不同的機器建立串連進行功能測試,一切都正常,以為萬無一失了,誰知道拿到實際中給其他人調用的時候卻出現錯誤,當時百思不得其解,最後沒有辦法,只好進行調試跟蹤,發現出錯是執行到CSingleLock lock(pMutex);的時候發生的,原因是pMutex指標為空白,明明在建構函式裡分配了,為什麼會變為空白指標呢?檢查程式也沒有其他地方錯誤釋放啊(這個指標是在解構函式裡釋放的)。
 到最後還發現第一次使用這個類是不會出錯的,只要第一次使用後的類對象沒有釋放,第二次使用就會出錯,認真查看代碼原來錯誤就出現在pMutex=new CMutex(FALSE,"ExSocketMutex");
這個語句粗略一看使用沒有錯誤,MSDN也沒有說明什麼能導致它錯誤的,但是它第二次執行的時候new返回的值是NULL,哪怕第一次使用是在另外一個進程!也就是第一個進程的使用竟然影響到第二個進程!
 出現這種情況只能是new CMutex(FALSE,"ExSocketMutex");這個語句涉及到了Windows核心,因為核心對象可以跨邊界訪問,而這個互斥對象恰好是通過命名"ExSocketMutex"實現跨邊界訪問的,也就是第一個進程建立了一個"ExSocketMutex"後,第二個進程可以通過"ExSocketMutex"名稱來訪問它但如果繼續建立這個互斥對象就會失敗!(請參考《Windows核心編程》第三章)
 所以操作核心對象不能用常規的編程思路去進行。
 這個互斥怎麼辦呢?不能去掉互斥啊,可以用以下的方法解決:
file ExSocket.cpp:

ExSocket::ExSocket()
{
 //initialization of the class
 CString s;
 s.Format(_T("ExSocketMutex%d"),this);//also using sprintf(str,"ExSocketMutex%d",this); for char array str

 pMutex=new CMutex(FALSE,(LPCSTR)s);
}
//other definition of the functions

 由於每個類對象不可能使用相同的地址空間,所有對Mutex的命名就不會重複,這樣就不會因為建立多個類對象而產生衝突了。但如果要在進程間互斥還是必須使用相同的命名的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.