w książce A. S. Tanebauma i H. Bosa pt. “Systemy operacyjne” znalazłem program napisany w C mający za zadanie tworzyć i zaraz niszczyć wątki. Kod ten skompilowałem w Dev-Cpp i działa! Tutaj kod:
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <pthread.h>
#define NUMBER_OF_THREADS 10
using namespace std;
void *phw(void *tid)
{
printf("Thread no.: %d\n", tid);
pthread_exit(NULL);
}
int main()
{
pthread_t thr[NUMBER_OF_THREADS];
int status, i;
for (i=0; i<NUMBER_OF_THREADS; i++)
{
printf("Hello World %d\n", i);
status = pthread_create(&thr[i], NULL, phw, &i);
}
}
Wynik działania jest jednak bardzo dziwny, dwa łańcuchy z funkcji printf() nakładają się na siebie i wszystko staje się nieczytelne (zrzut ekranu w załączniku). Dlaczego tak się dzieje i jak to poprawić. Z góry dziękuję za pomoc.
Prawdopodobnie dzieje się tak bo robisz to w wątkach wykonywanych w tym samym czasie (prawie), więc to tak może wyglądać. Uruchom program kilka razy i idę o zakład że otrzymasz różne wyniki w konsoli bo zależy to od aktualnej sytuacji w systemie, ile czasu procesora dostanie każdy wątek, algorytmu wywłaszczania. Przed wyświetleniem napisu uśpij wątek na tid sekund w tedy będą Ci się wyświetlały co sekundę.
Ewentualnie w pętli przed wyświetleniem napisu wykonaj jakieś obliczenia w pętli losową ilość razy dla poszczególnych wątków. W tedy nawet w różnej kolejności będą Ci się wyświetlały napisy z poszczególnych wątków.
Kwestią tego czemu się tak dzieje jest prawdopodobnie użyty przez Ciebie kompilator, ewentualnie jakieś opcje kompilacji.
Zgadza się, za każdym razem wynik jest trochę inny. Teraz sobie przysiadłem i dopisałem:
//Program to zmodyfikowana wersja listingu
//pochodzącego z książki A.Tanenbaum i H. Bos
//p.t. "Systemy operacyjne" s. 130n.
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <time.h>
#define NUMBER_OF_THREADS 10
using namespace std;
void czekaj(int sek) // dopisane teraz
{
int teraz=time(NULL);
while(time(NULL)<teraz+sek)
{
}
}
void *phw(void *tid)
{
czekaj(2); // dopisane teraz
printf("Thread no.: %d\n", tid);
pthread_exit(NULL);
}
int main()
{
pthread_t thr[NUMBER_OF_THREADS];
int status, i;
for (i=0; i<NUMBER_OF_THREADS; i++)
{
printf("Hello World %d\n", i);
status = pthread_create(&thr[i], NULL, phw, (void*)i);
czekaj(4); //dopisane teraz
}
system("PAUSE");
}
Teraz jest OK. Czy te błędy mogą wynikać ze specyfikacji procesora (Intel i5) i/lub systemu (Windows 10)? Listing z książki zakładał chyba, że wątek główny będzie czekał aż wykona się procedura z nowego wątku. Idę szukać dalej.
Nie znalazłem nigdzie opcji w Dev-C++ do zmiany sposobu wykonywania wątków.