Bibliotek DLL- wielowatkowosc
Ostatnio zmodyfikowano 2015-11-12 17:02
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
|
|
DejaVu |
» 2015-11-11 23:58:54 |
|
j23 |
» 2015-11-12 10:26:06 Zapięcie sekcji krytycznej/mutexa powinno rozwiązać problem. Można jeszcze zastosować std::atomic na IterationPointerEx. |
|
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. |
|
« 1 » |