Nowe posty

Autor Wątek: [C] problem z wątkami (pthread_cancel)  (Przeczytany 13479 razy)

Offline Piotr Janisz

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 8
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #15 dnia: 2007-12-29, 18:33:52 »
W gdb uruchamiałem to już kilkanaście razy, na jądrze 2.6.23 też sprawdzałem i też się krzaczy. Właściwie to siedzę nad tym problemem kilka dni i nie mogę dojść do tego. Może za dużo wątków rzeczywiście, bo ten program to raczej dla celów edukacyjnych napisałem. Czytałem gdzieś że Native Posix Thread Library nie jest do końca zgodne z posix, więc może tutaj jest właśnie niezgodne

EDIT
Nie, ponieważ w poleceniu (to jest moje "zadanie domowe" z systemów operacyjnych) jest napisane, że wątek po zakończeniu działania ma anulować pozostałe, a poza tym nigdzie nie jest napisane, że wątki można anulować tylko z wątku nadrzędnego :)

EDIT
można zwracać NULL, w przykładach w różnych książkach tak jest

Offline

  • Users
  • Guru
  • *****
  • Wiadomości: 825
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #16 dnia: 2007-12-29, 18:52:55 »
A jak bardzo solaris zgodny jest z POSIX?

M.

Offline Piotr Janisz

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 8
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #17 dnia: 2007-12-29, 19:31:07 »
w sumie to nie wiem :), w każdym razie tam działa. Jeszcze jedna obserwacja - w Solarisie tid moich wątków są małymi liczbami - 1, 2, 3 ... Natomiast w Linuxie są to duże liczby np. 3084835728. Przeglądałem kod funkcji pthread_cancel() i okazało się, że TID wątków w Linuxie jest wskaźnikiem do struktury opisującej wątek, i tam są odwołania do pól tej struktury.

Offline

  • Users
  • Guru
  • *****
  • Wiadomości: 825
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #18 dnia: 2007-12-29, 19:32:30 »
Dziwne jest to, że jak doda się funkcję sleep to wszystko ładnie działa. Może jakaś dodatkowa synchronizacja?

M.

Offline Piotr Janisz

  • Users
  • Nowy na forum
  • *
  • Wiadomości: 8
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #19 dnia: 2007-12-29, 19:43:35 »
a gdzie dodałeś sleep?
bawiłem się już synchronizacją mutexami - zrobiłem tak, że tylko jeden wątek na raz mógł odwoływać się do tablicy thread_tab (w której trzymam TID'y). Główny wątek najpierw blokował mutex, uruchamiał wszystkie wątki, następnie go zwalniał. Pozostałe wątki podobnie - blokowały mutex, anulowały wszystkie wątki i zwalniały go. Wtedy program dostawał SIGSEGV, gdy główny wątek wywoływał pthread_join() :-)

Offline

  • Users
  • Guru
  • *****
  • Wiadomości: 825
    • Zobacz profil
[C] problem z wątkami (pthread_cancel)
« Odpowiedź #20 dnia: 2007-12-29, 19:48:45 »
#include 
#include
#include

#define THREAD_NUM 10

int thread_num = THREAD_NUM;
pthread_t thread_tab[THREAD_NUM];

void* run(void* arg)
{
        int i;
        pthread_t self;

        printf("ble\\n");
        self = pthread_self();
        for (i = 0; i < THREAD_NUM; i++)
                if (thread_tab[i] && !pthread_equal(self, thread_tab[i]))
                  pthread_cancel(thread_tab[i]);
        return NULL;
}

int main(void)
{
        int i;

        for (i = 0; i < THREAD_NUM; i++){
                thread_tab[i] = 0;
}
        for (i = 0; i < THREAD_NUM; i++){
                pthread_create(&thread_tab[i], NULL, run, NULL);
sleep(1);
        }
        for (i = 0; i < THREAD_NUM; i++){
                pthread_join(thread_tab[i], NULL);
sleep(1);
        }

        return 0;
}