現在有一個動態鏈接庫matlink.dll
其中有一方法:
int ZMatchTemplateOne(BYTE* pSrc,BYTE *pDst);
pSrc:指紋模板
pDst:指紋驗證信息
在使用C調用時,沒有任何問題,但是使用C#時,同樣的指紋模板及指紋信息,在多線程調用時就會出現問題,主要是返回的指紋比對值不同。
誰可以幫助一下啊!
代碼:
fingerIN = "指紋信息";
fingerINforByte = strToToHexByte(fingerIN);
fingerData = "指紋模板";
fingerDataforByte = strToToHexByte(fingerData);
多線程:
for (int a = 0; a < 線程數量;a++)
{
Thread th = new Thread(new ParameterizedThreadStart(fingerMatch));
th.IsBackground = true;
th.Start(a);
}
fingerMatch:
……
for (int i = 0; i < 比對次數;i++)
{
int res = ZMatchTemplateOne( fingerDataforByte, fingerINforByte);
}
……
如果把ZMatchTemplateOne方法加鎖後,便不會出現問題,但是驗證指紋數量太多,必須采用多線程處理,頭疼,麻煩各位幫忙解決一下,謝謝了!
注:DLL是廠家提供的,沒有具體的代碼。但是廠家提供的程序是使用DELPHI寫的,運行沒有問題。。。唉
用C語言調用或用Delphi調用沒有線程問題嗎? 如果沒有的話, 那可以用C語言再封裝一次嘛。
如果C語言在多線程調用時也有問題,那只能說廠家的DLL不支持多線程,聯系廠家詢問詢問。
但真心覺得調用時加鎖沒什麼大不了的,除非這個指紋驗證算法巨慢無比,或者並發量實在太大(實際上多線程也就是能發揮多核CPU的優勢而已),性能問題只有在壓力測試或實際使用過程中出現問題時才有解決的必要。
如果前邊的方案不靈或不可接受, 那你還可以搞多進程分布式。 即把驗證指紋做成服務,通過SOAP、REST或者RPC等方法公開接口, 該服務可以運行多個實例, 每個實例都是獨立的進程。 然後所有需要指紋驗證的地方,都改為調用這個服務,調用時通過簡單算法控制請求均勻分布到種個服務實例上就行了。