Skocz do zawartości

Thread -> Segmentation Fault


neo_fox

Rekomendowane odpowiedzi

Próbuje sobie poćwiczyć z wątkami. Napisałem coś takiego:

 

#include <iostream>
#include <pthread.h>
using namespace std;

void* thread1(void*)
{
cout << "Thread" << endl;	
return NULL;
}

int main()
{
pthread_t tid;
pthread_create(&tid, NULL, thread1,NULL);
for(int x = 0; 100; x++)
{
 cout << x << endl;
}
pthread_exit(&tid);
return 0;
}

 

Kompiluje się bez problemu ale przy uruchomieniu mam:

Program has been terminated receiving signal 11 (Segmentation fault)

Wie ktoś może w czym leży problem?

 

OK już mam smile.gif

Odnośnik do komentarza
Udostępnij na innych stronach

I co było przyczyną? U mnie program poprawnie się skompilował

i uruchomił bez żadnych błędów. Jedynym mankamentem był fakt,

że wpadł w nieskończoną pętlę i wypisywał kolejne liczby naturalne smile.gif

Przyczyną był warunek końca pętli for. Powinno być:

   for(int x = 0; x < 100; x++)

 

Napisz co było przyczyną segfolta.

Odnośnik do komentarza
Udostępnij na innych stronach

Niekończąca się pętla była zamierzona. Program miał/ma wyglądać w efekcie tak:

 

#include <iostream>
#include <pthread.h>


using namespace std;

void* thread1(void*);
void* controlThread(void*);
bool end = false;
bool wait = false;

int main()
{

pthread_t tid1, tid2;
cout << "Press [x] to end the program" << endl;
pthread_create(&tid1, NULL,thread1,(void*)"I'm thread number 1");  // utwórz wątek główny
pthread_create(&tid2, NULL, controlThread, NULL);  	// utwórz wątek kontrolny

pthread_exit(&tid1);
pthread_exit(&tid2);
return 0;
}

void* thread1(void* arg)
{
for(int x = 0; true;x++)
{
 if(wait == false)
 {
 	cout << (char*)arg << " my counter is:  " << x << endl; 
 	sleep(1);	// uśpij na sekundę aby zwolnić tempo
 }
 else
 {
 	sleep(1);
 	x--;
 }
 if(end == true)
 	break;
}

return NULL;
}
void* controlThread(void*)
{
char in,conf;
do
{
 cin >> in;
 if(in == 'x' || in == 'X')
 {
 	wait = true;
 	cout << "Really? y/n" << endl;
 	cin >> conf;
 	if(conf == 'y' || conf == 'Y')
   end = true;
 	else
   wait = false;
 }
}
while(end == false);

return NULL;
}

 

A błąd zniknął po użyciu dodatkowego przełącznika:

g++ -o simple simple.cpp -Wno-deprecated -lpthread[/B]

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...