Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Bibliotek DLL- wielowatkowosc

Ostatnio zmodyfikowano 2015-11-12 17:02
Autor Wiadomość
Tomasssz
Temat założony przez niniejszego użytkownika
Bibliotek DLL- wielowatkowosc
» 2015-11-11 20:26:31
Witam serdecznie,
Bardzo potrzebuje pomocy. Zycie zmusilo mnie do napisania bilblioteki DLL dzialajacej w srodowisku Windows. Niestety nie mam dostepu, ani wplywu na program nadrzedny, ktory ma wykorzystywac ta moja biblioteke. Wiem tylko ze program nadrzedny uzywa wielowatkowosci i tu pojawia sie problem. Na poczatku swojego dzialania program nadrzedny alokuje pamiec i przekazuje mi liste wskaznikow. Sa one przekazywane jako storage w kolejnych iteracjach funkcji initializeStorageEx. Wykonuje ta czynnosc cyklicznie. Zbieram te wskazniki i zapisuje je do tablicy. Bardzo wazna jest dla mnie prawidlowa kolejnosc tych wskaznikow. Dlatego stworzylem zmienna IterationPointerEx, ktora rosnie wraz z kolejnym wskaznikiem. Moja biblioteka dziala jesli ogranicze sie do jednego watku. Kiedy jest jednak wlaczona wielowatkowosc kolejne watki ignoruja zmiany zmiennej IterationPointerEx wykonane przez inne watki. Probowalem z biblioteka Mutex ale nie pomaga. Zupelnie jakby kazdy watek mial swoja wlasna zmienna IterationPointerEx. Moze tak jest jesli wielowatkowosc jest definiowana w programie nadrzednym. Jest jakis sposob aby watki komunikowaly sie co do wartosci tej zmiennej? Moge definiowac zmienne tylko z poziomu swojej biblioteki. Jestem zupelnym laikiem jesli chodzi o c++ i wielowatkowosc. Mam nadzieje ze ktos cos doradzi. Moze jest mozliwe jakies zupelnie inne obejscie problemu.
Pozdrawiam
Tomek

class ExamplePlugin : public IPlugin
{
 public:
    ExamplePlugin(){ //ta funkcja jest wywolywana jako pierwsza przy uruchamianiu programu nadrzednego
                IterationPointerEx=int(0);}


    virtual ~ExamplePlugin(){};

    float * PointersStorageEx[3000]; //tablica w ktorej zapisuje kolejne wskazniki
    int IterationPointerEx;          //inicjuje zmienna, ktora mi numeruje kolejne wywolania funkcji initializeStorageEx

    void initializeStorageEx(float* storage){
      PointersStorageEx[IterationPointerEx]=storage;
      IterationPointerEx=IterationPointerEx+1;
};
    
};

#endif
P-139965
DejaVu
» 2015-11-11 23:58:54
http://stackoverflow.com​/questions/4911994​/sharing-a-global-static-variable-between-a-process-and-dll
http://www.boost.org/doc/libs​/1_35_0/doc/html/interprocess​/sharedmemorybetweenprocesses.html

/edit:
W Windowsie chyba najciekawszym rozwiązaniem są DLL-ki com-owe, które umożliwiają utworzenie jednej instancji na podstawie GUID-a DLL-ki i odwoływaniu się do jednego wspólnego źródła danych, pomimo wielu użyć DLL-ek.
P-140011
j23
» 2015-11-12 10:26:06
Zapięcie sekcji krytycznej/mutexa powinno rozwiązać problem. Można jeszcze zastosować std::atomic na IterationPointerEx.
P-140018
Tomasssz
Temat założony przez niniejszego użytkownika
» 2015-11-12 17:02:40
Dzieki za wskazówki. Przeczytam i bede walczyl dalej.
Pozdrawiam
T.
P-140038
« 1 »
  Strona 1 z 1