ZThread interrupt() - zabijanie watkow

0

Program ginie po zawołaniu inerrupt(), chociaż powinny zginąć tylko wątki. Może mi ktoś pomóc ? Wiem, że problem leży w tym, że zabijam wątek który właśnie wykonuje operację blokującą (jak usunę Mutex i sleep program działa poprawnie, giną wątki i ciało głównego wątku wykonywane jest dalej), jednak jeśli ta część jest, program zostaje ubity od razu po zawołaniu interrupt.

Proszę o pomoc..

#include <cstdlib>
#include <iostream>
#include <zthread/Runnable.h>
#include <zthread/Thread.h>
#include <zthread/Mutex.h>
#include <conio.h>

using namespace ZThread;

class Piszacy : public Runnable{
      private:
      int id;
      Mutex *lock;
      public:
      Piszacy(int id1, Mutex* l):id(id1),lock(l) {}
      void run() {
           try {
           while (!Thread::interrupted()) {
                        lock->acquire();
                        std::cout << id;
                        Thread::yield();
                        std::cout << std::endl;
                        lock->release();
                        Thread::sleep(300);
                        }
           } catch(Interrupted_Exception& e) {
                        std::cout << "przerwanie przez wyjatek " << id << std::endl;
           }
      }
};

int main(int argc, char *argv[])
{
    try {

        Mutex lock;
        Piszacy p1(1,&lock);
        Piszacy p2(2,&lock);
        
        Thread t1(&p1);
        Thread t2(&p2);
        
        getche();
        
        t1.interrupt();
        t2.interrupt();
        

        std::cout << "zamknalem watki" << std::endl;

    } catch(Synchronization_Exception& e) {
        std::cout << e.what() << std::endl;
    }

    std::cout << "dalszy ciag programu..." << std::endl;

    getche();
    return EXIT_SUCCESS;
}
0

popraw temat - ikonka z napisem 'edycja'

0

Po kliknięciu "edycja" dostaje coś takiego:
"Błąd programu. Przekazano nieprawidłowe parametry"

Aha, a co do problemu, to możliwe jest, że biblioteka jest wadliwa. A takie rzeczy jak zmiana tematu, to moderator mógłby sam robić, tak samo jak przenoszenie do właściwego działu (przynajmniej taka jest tendencja na wszystkich forach z których korzystam, a jest ich kilka).

0

co do obowiazkow moderatora, to prawda, zawsze mi sie wydawalo ze od tego sa wlasnie moderatorzy zeby czyscic topiki z offtopikow, przesuwac watki i po poprawiac ewentualne kaszany w postach

a co do tematu.. ZThread to jest koniecznosc czy Twoj wybor? jak sie trafilo ze jest uszkodzona albo cos, to moze sprobuj uzyc boost::thread

0

Konieczność, a boost::thread jest niestety niewystarczające. Chodzi o pewne rozwiązania, które są w ZThread, a przede wszystkim same tworzenie wątków (styl znany z Javy, czyli interfejs Runnable i tworzenie na jego podstawie klasy, która ma metode run() etc).

A wracając do problemu, który mnie prześladuje. Program wykłada się w momencie zawołania interrupt(), ale żeby było weselej wykłada się tylko jak wątek wykonuje operację blokującą (ma przydzielony mutex albo wykonuje sleep()), wtedy scenariusz powinien być taki:

  1. t.interrupt()
  2. w t rzucany jest wyjątek Interrupted_Exception, wykonywany jest catch
  3. watek umiera i NIE ma to wpływu na pozostałe wątki (przede wszystkim wątek główny).

a u mnie jest tak:

  1. t.interrupt()
  2. w t rzucany jest wyjątek i catch zaczyna być wykonywany i w tym momencie wszystko umiera (sleep wykonywany jest do końca i dopiero po tym umierają wszystkie wątki, stąd wiem ile catch`a jest wykonane)

Z dyskusji podjętej na code.box.sk wychodzi, że może to być błędnie skompilowana biblioteka. Jest tam powien człowiek o nicku THA który z tą biblioteką wiele pracował i skompiluje ją jeszcze raz (zbuduje od nowa całego DevPak`a). Być może rozwiąże to wszystkie problemy, na które natrafiłem, a jeśli nie, to możliwy jest błąd w samej bibliotece (ale to będzie raczej mało prawdopodobne).

0

hm.. a patrzales czy zamiast interrupted-exception nie jest tam przypadkiem rzucany inny wyjatek jeszcze? opakuj dodatkowo cale (laczenie z obecnym try-catch) wnetrze void run() w extra try{ .. }catch(std:exception& ex){ cout << ex.what() <<endl;}
opis twojej sytuacji przypomina mi wlasnie rzucenie nie oslugiwanego wyjatku w watku -- powoduje to klasyczne zamkniecie procesu, nie tylko aktualnego watku ktory sie wylozyl

0

dodałem dodatkowy try/catch i kod jest teraz taki:

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <zthread/Runnable.h>
#include <zthread/Mutex.h>
#include <zthread/Guard.h>
#include <zthread/Exceptions.h>
#include <zthread/ThreadedExecutor.h>

using namespace std;

using namespace ZThread;

class Piszacy : public Runnable{
      private:
      int id;
      Mutex *lock;
      public:
      Piszacy(int id1, Mutex* l):id(id1),lock(l) {}
      void run() {
           try {
               try {    
               while (!Thread::interrupted()) {
                  if(Thread::interrupted()) break; 
                  Guard<Mutex> g(*lock);
                  cout << id;
                  Thread::yield();
                  cout << endl;
                  Thread::sleep(300);
               }
               
               } catch(Interrupted_Exception& e) {
                     std::cout << "przerwanie przez wyjatek " << id << std::endl;
               }
           } catch (std::exception& ex) {
                   cout << "catch2 " << ex.what() <<endl;
           }
      }
};

int main(int argc, char *argv[])
{
        try {
        
            Mutex lock;
        
            ThreadedExecutor executor;

            executor.execute(new Piszacy(1,&lock));
            executor.execute(new Piszacy(2,&lock));
        
            getche();
            std::cout << "dalszy ciag... " << std::endl;

            executor.interrupt();
            
            std::cout << "po interrupt" << std::endl;
            
            executor.wait();

            std::cout << "dalszy ciag programu" << std::endl;
                     
        } catch(Synchronization_Exception& e) {
          std::cout << e.what() << std::endl;
        }
        std::cout << "wyszedlem z try" << std::endl;
        getche();
        return EXIT_SUCCESS;
}

Program nadal wykłada się tak samo jak wcześniej. Podejrzewam źle skompilowaną bibliotekę. Powalczę z tym i zobaczę co z tego będzie. Na pewno dam znać co było przyczyną problemów :).

0

Ot: http://4programmers.net/Forum/viewtopic.php?id=110773

dlatego nie mozesz wyedytowac, ale jesli usuniesz z linka recznie niestety wszystkie 'amp;' to zadziała

quetzalcoatl, po to jest ikonka edycji, zeby autor sam poprawiał, zgodnie z zasadami wcale nie musze mu tego proponowac, moge wywalic wątek z niewlasciwym tytulem prosto do kosza albo calkowicie wywalic od razu, jedynie ze wzgledu na tresc zagadnienia tego nie zrobiłem, p to zreszta się logujesz zeby mozna było okreslic ktore posty są twoje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1