pthread
От: arsenal Россия  
Дата: 02.04.03 20:33
Оценка:
Господа программисты помогите плиз разобраться с многопоточным программированием под линукс(у меня slackware 8.1)
компилятор находит pthread.h
а вот pthread_create(...) уже не узнает
вообщем следующий код не компилируется.
#include <pthread.h>
void* f(void*){
}
void main(){
void* arg;
pthread_t th;
pthread_create(&th,NULL,f,arg);
}
Re: pthread
От: White Eagle Россия  
Дата: 03.04.03 05:48
Оценка:
Здравствуйте, arsenal, Вы писали:

A>Господа программисты помогите плиз разобраться с многопоточным программированием под линукс


A>вообщем следующий код не компилируется.

[skip]

Банальный вопрос — библиотека pthread подключена(ключ линковщика -lpthread)?
Если да, давай логи компиляции.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[2]: pthread
От: Аноним  
Дата: 03.04.03 07:58
Оценка:
Кому банальный, а иной начинающий программер
будет неделю сидеть и не разберется!

WE>Банальный вопрос — библиотека pthread подключена(ключ линковщика -lpthread)?

WE>Если да, давай логи компиляции.
Re: pthread
От: m.a.g. Мальта http://dottedmag.net/
Дата: 03.04.03 09:17
Оценка:
Здравствуйте, arsenal, Вы писали:

A>компилятор находит pthread.h

A>а вот pthread_create(...) уже не узнает

Если ругается на что-нибудь типа

/tmp/cclw303p.o(.text+0x11): undefined reference to `pthread_create'


то нужно указать ключ -lpthread компилятору.
Re: pthread
От: arsenal Россия  
Дата: 03.04.03 09:21
Оценка:
спасибочки совсем забыл про опцию lpthread
теперь другая проблема :следующий код компилится но thread не выполняется до конца.

#include <pthread.h>
#include <iostream.h>
#include <LEDA/window.h>

void* f(void*){
cout<<"Trace1"<<endl; //этот cout проходит
window W;
w.init(0,10,20,30,"Title");
cout<<"Trace2"<<endl;//а вот этот cout уже не выполняется

};
void main(){
pthread_t th;
void* arg;
pthread_create(&th,NULL,f,arg);
}
Re[2]: pthread
От: White Eagle Россия  
Дата: 03.04.03 10:00
Оценка:
Здравствуйте, arsenal, Вы писали:

A>спасибочки совсем забыл про опцию lpthread

A>теперь другая проблема :следующий код компилится но thread не выполняется до конца.

A>#include <pthread.h>

A>#include <iostream.h>
A>#include <LEDA/window.h>

A>void* f(void*){

A> cout<<"Trace1"<<endl; //этот cout проходит
A> window W;
A> w.init(0,10,20,30,"Title");
A> cout<<"Trace2"<<endl;//а вот этот cout уже не выполняется

A>};

A> void main(){
A> pthread_t th;
A> void* arg;
A> pthread_create(&th,NULL,f,arg);
A>}
А ты думал? У тебя родитель завершается и дитё за ним следом дохнет. Чтобы не оставлять дитё сиротой, юзай pthread_join(th, NULL) последней строчкой в main.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[2]: pthread
От: arsenal Россия  
Дата: 03.04.03 10:39
Оценка:
спасибочки.вызвал pthread_join все заработало только снова ни так как хотелось бы. Не могу получить два одновременно отображающихся окна. то segemntation core выскакивает а то xlib:unexpected async reply(sequence 0xe2)
Re: pthread
От: arsenal Россия  
Дата: 03.04.03 10:45
Оценка:
вообщем следующий код не работает
#include <pthread.h>
#include <iostream.h>
#include <LEDA/window.h>
#define NUMBER_THREADS 2

void* f(void* pw){
cout<<"Function has been worked!!!"<<endl;
window* pW = (window*) pw;
int exit_but = pW->button("Exit",111);
pW->display(window::center,window::center);
while(1){
double x,y;
int button = -1;
bool click = false;
int event = pW->read_event(button,x,y);
if(button == exit_but){
cout<<"You have just pressed exit-button!!!"<<endl;
break;
}
}


};
void main(){
pthread_t th[NUMBER_THREADS];
window *pw[NUMBER_THREADS];
for(int i = 0;i <NUMBER_THREADS ;i++){
pw[i] = new window(300,400,"My window");
pthread_create(&th[i],NULL,f, (void*) pw[i]);
}
for(int i = 0;i <NUMBER_THREADS ;i++){
pthread_join(th[i], NULL);
}
}
Re[3]: pthread
От: White Eagle Россия  
Дата: 03.04.03 10:58
Оценка: 2 (1)
Здравствуйте, arsenal, Вы писали:

A>спасибочки.вызвал pthread_join все заработало только снова ни так как хотелось бы. Не могу получить два одновременно отображающихся окна. то segemntation core выскакивает а то xlib:unexpected async reply(sequence 0xe2)


unexpected async reply обозначает, что XLib не проинициализирована для работы с потоками. Вызови в начале main
функцию XInitThreads(), должно спасти.

А ты в курсе, справа вверху сообщения кнопочки такие с оценочками...
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[4]: pthread
От: arsenal Россия  
Дата: 03.04.03 11:54
Оценка:
вызываю XInitThreads();
компилятор ругается на эту функцию может какой-нибудь еще заголовочный файл нужно подключить кроме pthread.h
за ранее спасибо
Re[5]: pthread
От: White Eagle Россия  
Дата: 03.04.03 12:15
Оценка: 2 (1)
Здравствуйте, arsenal, Вы писали:

A>вызываю XInitThreads();

A>компилятор ругается на эту функцию может какой-нибудь еще заголовочный файл нужно подключить кроме pthread.h
A>за ранее спасибо

Хедер — <X11/Xlib.h>
Сама либа -lX11

Странно, что твоя LEDA эти вещи сама не подцепила.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[6]: pthread
От: arsenal Россия  
Дата: 03.04.03 13:10
Оценка:
спасибочки в очередной раз только вот опять что-то нитак следующий код выбрасывает segementation fault
#include <pthread.h>
#include <iostream.h>
#include <LEDA/window.h>
#include <X11/Xlib.h>
#define NUMBER_THREADS 5

void* f(void* arg){
cout<<"Function has been worked!!!"<<endl;
window W(300,300,"Title");
int exit_but = W.button("Exit",111);
W.display(window::center,window::center);
while(1){
int k ;
double x, y;
int event = W.read_event(k, x, y);
if ( k == exit_but){
W.close();
break;
}
}
cout<<"Pthread has been finished!!!"<<endl;
cout<<"------------------------------------"<<endl;


};
void main(){
XInitThreads();
pthread_t th[NUMBER_THREADS];
for(int i = 0;i <NUMBER_THREADS ;i++){
pthread_create(&th[i],NULL,f, 0/*(void*) pw[i]*/);
}
for(int i = 0;i <NUMBER_THREADS ;i++){
pthread_join(th[i], NULL);
}
}
Re[7]: pthread
От: White Eagle Россия  
Дата: 03.04.03 13:44
Оценка:
Здравствуйте, arsenal, Вы писали:

A>спасибочки в очередной раз только вот опять что-то нитак следующий код выбрасывает segementation fault



А без потоков функция работает? Просто если её одну из main-а вызвать?
Если да — вероятно библиотека LEDA прссто не thread-safe.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[8]: pthread
От: arsenal Россия  
Дата: 03.04.03 14:03
Оценка:
да без потока все работает замечательно.вот возникла необходимость распараллелить окна а не выходит. А как узнать thread-safe ?
Re[8]: pthread
От: arsenal Россия  
Дата: 03.04.03 14:06
Оценка:
segmentation fault невсегда выпадает и еще влияние оказывает while(1){...}внутри потока без него вроде segmentation не вылетает.Да и еще а можно какой примерчик с потоками или ссылочку на руководство по потокам. Буду рад любым ответам советам и ссылкам.
заранее спасибо
Re[8]: pthread
От: arsenal Россия  
Дата: 03.04.03 14:07
Оценка:
да и еще все вроде корректно работает если NUMBER_THREAD = 1
Re[9]: pthread
От: White Eagle Россия  
Дата: 04.04.03 07:47
Оценка:
Здравствуйте, arsenal, Вы писали:

A>segmentation fault невсегда выпадает и еще влияние оказывает while(1){...}внутри потока без него вроде segmentation не вылетает.Да и еще а можно какой примерчик с потоками или ссылочку на руководство по потокам. Буду рад любым ответам советам и ссылкам.

A>заранее спасибо

Меня в твоём коде сильно смутил этот фрагмент:
int k ;
double x, y;
int event = W.read_event(k, x, y);


Нахрена передавать в функцию по значению неинициализированные переменные, да ещё сразу 3?
Есть надежда, что дело в этом.

Насчёт thread-safe — читай документацию к библиотеке, некоторые библиотеки не задумывались для работы с многопоточностью, и для таких segfault — обычное дело.

Насчёт tutorial ничего не подскажу, сам в своё время по man и форумам разбирался.
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[10]: pthread
От: arsenal Россия  
Дата: 04.04.03 10:22
Оценка:
Здравствуйте, White Eagle, Вы писали:

WE>Здравствуйте, arsenal, Вы писали:


A>>segmentation fault невсегда выпадает и еще влияние оказывает while(1){...}внутри потока без него вроде segmentation не вылетает.Да и еще а можно какой примерчик с потоками или ссылочку на руководство по потокам. Буду рад любым ответам советам и ссылкам.

A>>заранее спасибо

WE>Меня в твоём коде сильно смутил этот фрагмент:

WE>
WE>int k ;
WE>double x, y;
WE>int event = W.read_event(k, x, y);
WE>


WE>Нахрена передавать в функцию по значению неинициализированные переменные, да ещё сразу 3?

WE>Есть надежда, что дело в этом.

WE>Насчёт thread-safe — читай документацию к библиотеке, некоторые библиотеки не задумывались для работы с многопоточностью, и для таких segfault — обычное дело.


WE>Насчёт tutorial ничего не подскажу, сам в своё время по man и форумам разбирался.

Что касается 3 непроинициализированных переменных то все они являются выходными параметрами
Re[11]: pthread
От: White Eagle Россия  
Дата: 04.04.03 10:51
Оценка:
Здравствуйте, arsenal, Вы писали:

A>Что касается 3 непроинициализированных переменных то все они являются выходными параметрами


Ага, уже понял, это С++ оказывается.
Тогда, боюсь, беда
Никогда не делайте ничего правильно с первого раза, иначе никто потом не оценит, как это было сложно.
Re[12]: pthread
От: Аноним  
Дата: 04.04.03 13:56
Оценка:
Здравствуйте, White Eagle, Вы писали:

WE>Здравствуйте, arsenal, Вы писали:


A>>Что касается 3 непроинициализированных переменных то все они являются выходными параметрами


WE>Ага, уже понял, это С++ оказывается.

WE>Тогда, боюсь, беда
да кстати немного покапался и обнаружил, что существуют специальные xthread в (Xthreads.h) может в этом все дело?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.