c++ निःशुल्क लाइब्रेरी कॉल करने पर संभावित डेडलॉक



delphi dll (1)

मैंने इस तरह की एक समस्या देखी है, हालांकि मैं डेल्फी 10.0 सिएटल, और डेल्फी डीएनएल लोड हो रहा है, डेल्फी एक्सईई उपयोग कर रहा था।

वैसे भी, जिस समाधान के साथ मैं आया हूं वह निम्नलिखित है:

  1. अपने डेल्फी डीएलएल में, पहले अपना खुद का थ्रेड पूल बनाएं।

  2. अतिभारित संस्करण का उपयोग करें TParallel.कि एक थ्रेड पूल ऑब्जेक्ट को अपने अंतिम पैरामीटर के रूप में लेता है, और अपना स्वयं का थ्रेड पूल ऑब्जेक्ट प्रदान करें।

  3. अपने डेल्फी डीएलएल को उतारने से पहले, अपने थ्रेड पूल ऑब्जेक्ट को मुक्त करना सुनिश्चित करें

इस दृष्टिकोण ने मेरे लिए समस्या का समाधान किया

TParallel. दस्तावेज़ीकरण के लिए:

http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Threading.TParallel.For

उदाहरण छद्म कोड:

MyPool: TThreadPool;
MyPool := TThreadPool.Create;

TParallel.For(1, Max, procedure (I: Integer)
    begin
      if IsPrime (I) then
        TInterlocked.Increment (Tot);
    end, 
MyPool  
);

MyPool.Free;

मुझे डेल्फी एक्सई 7 में एक DLL लिखना होगा। मैं TParallel का उपयोग करना चाहता हूँ। DLL में DLL को C ++ एप्लिकेशन में लोड किया जाता है, जहां सब कुछ काम करता है हालांकि, जब आवेदन समाप्त होता है, या फ्रीलाइबरी को कॉल किया जाता है, तो आवेदन लटका हुआ है अगर मैं सभी TParallel को हटा देता हूं। लूप के लिए और उन्हें मानक छोरों के साथ बदलते हैं, तो एप्लिकेशन सामान्य रूप से निकलता है।

टीपेरलले। लोचे बहुत सरल हैं:

TParallel.For(0, inImage.Height -1, 
  Procedure(ty : integer)
  begin
    SomeProcedure(ty);
  end);

अगर मैं बिल्कुल उसी कोड के साथ एक डेल्फी आवेदन बना रहा हूँ, तो सबकुछ पूरी तरह से काम करता है।

बहुत सारे शोध और डीबगिंग करने के बाद, ऐसा लगता है कि एक गतिरोध है जो सी ++ एप्लिकेशन को निस्तब्धता से रोका जा रहा है जब फ्रीलाबरी को बुलाया जाता है, लेकिन मुझे पता नहीं है कि समस्या TParallel में कहां है

बस स्थिति का सारांश:

  • TParallel। सभी छोरों को पूरा और सही परिणाम उत्पन्न।
  • एक डेल्फी .एक्सई में सटीक समान TParallel। कोड के लिए ठीक से काम करता है
  • DLL लोड किया जाता है और फ़ंक्शन को C ++ एप्लिकेशन के भीतर से कहा जाता है और ठीक से कार्य करता है।
  • यदि कोई TParallel नहीं है तो C ++ एप्लिकेशन सही से बाहर निकल जाएगा। लूप के लिए
  • सी + + अनुप्रयोग लटकाएगा यदि टीपेरलले हैं। लूप के लिए
  • मुझे लगता है कि एक गतिरोध है जो तब होता है जब FreeLibrary कहा जाता है।
  • अगर मैं ओटीएल थ्रेडिंग लाइब्रेरी का उपयोग करता हूं, तो सब कुछ उतनी ही काम करता है जितना चाहिए

मेरे प्रश्न हैं:

क्या किसी और को इस व्यवहार का अनुभव है?

इस स्थिति में गतिरोध को खोजने के लिए एक अच्छी डिबगिंग रणनीति क्या है?

किसी भी सलाह की काफी सराहना की जाती है।

अद्यतन करें

ठीक है, इसलिए यदि आप चाहते हैं कि न्यूनतम, पूर्ण और प्रमाणित उदाहरण, आप यहां जाएं (धन्यवाद स्टीफन बॉल):

library ADelphiDLL;

uses
  System.SysUtils, System.Classes, Threading, SyncObjs;

function IsPrime (N: Integer): Boolean;
var
 Test: Integer;
begin
 IsPrime := True;
 for Test := 2 to N - 1 do
   if (N mod Test) = 0 then
   begin
     IsPrime := False;
     break; {jump out of the for loop}
   end;
end;

function Prime(Max : integer) : boolean;
var
  tot : integer;
begin
   tot := 0;
   TParallel.For(1, Max, procedure (I: Integer)
    begin
      if IsPrime (I) then
        TInterlocked.Increment (Tot);
    end);
   return true;
   end;

exports Prime;

begin
   IsMultiThread := True;
end.

सी ++ में:

#include "stdafx.h"

typedef bool(__stdcall *primesf)(int);

void main()
{
HINSTANCE hGetDLL = LoadLibrary(L"ADelphiDLL.dll");
primesf primes = (primesf)GetProcAddress(hGetProcIDDLL, "Primes");
bool result = primes(100);
FreeLibrary(hGetDLL);// <-- Hangs here forever
}

बहुत मददगार "टिप्पणियों के जवाब में," कोड में एक दोष है "और" इसे खुद डिबग करें ", धन्यवाद, यही वह समय है जो मैं बहुत समय तक कर रहा हूं। इसलिए, अगर यहाँ आने वाली कोई मदद नहीं है, तो मैं ओटीएल में स्विच करने की कोशिश करूँगा और उसे अनुमति देगा, जो डीएलएल में काम करता है।

2 अद्यतन करें

ओटीएल वास्तव में अपेक्षित रूप से काम करता है तो, हाँ, वहाँ "कोड में दोष" है। मैं हार मानता हूं। मैं पूरी तरह डेल्फी को छोड़ने की सलाह दूंगा और फिर हम सब कुछ सी ++ और सी # पर ले जा सकते हैं यह एक बेहतर लघु (और दीर्घकालिक) समाधान होना चाहिए