LINUX.ORG.RU

pthread


0

0

помогите новичку освоить многопоточное программирование под линукс у меня slackware 8.1 Проблема в том что компилятор находит файл pthread.h а вот не может найти pthread_create Вообщем следующий код не компилиться #include <pthread.h>

void *f(void *){ } void* arg; pthread_t tid; void main(void) { pthread_create(&tid[i], NULL, f, (void *)arg); }


Ответ на: комментарий от Dead

Спасибо за помощь. Точно забыл опцию -lpthread. Теперь другая проблема: пытаюсь запихнуть создание окна(Leda-вского) в thread.Ошибок нет и окно не создается.

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

void* f(void*){ cout<<"f() has started working!!!"; //выполнятся window W; W.init(0,10,0,10,"My window"); cout<<"At the end of the f()"<<endl;//а этот уже НЕ выполняется } void main(){ pthread_t th; void* arg; pthread_create(&th,NULL,f,arg); }

arsenal
() автор топика

я не знаю, что такое "ледовское окно", но есть подозрение, что окно (или объект), создавшись сразу и умирает - потоковая функция завершается и деструктор вызывается.... делай static или работай с глобальной переменной или зацикли поток, чтоб он ждал твой объект

laban
()
Ответ на: комментарий от laban

да в том дело что не умерает коли даже второй cout не срабатывает и зацикливание внутри thread в виде while(1); не помогает

anonymous
()
Ответ на: комментарий от anonymous


т.е. без окна все работает и окно твое создается нормально если его коструировать не в функции потока?
тады "ой"
значит смотри что происходит в этом конструкторе. создай объект до потока, а в поток передай дескриптор (или какой другой ресурс) окна...
на поток грешить нечего. рассматривай его как обычную функцию, которая исполняется параллельно с остальным кодом. просто операционка берет на себя обязательства по планированию чего и когда будет исполняться (и порядок при этом не гарантируется).

laban
()

изменил код а segmentation 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); } }

arsenal
() автор топика
Ответ на: комментарий от nobody

Да указывал вот мой Makefile может что-то в нем не то LEDAROOT = /mnt/linux/LEDA-4.1 LEDAMAIN = L LEDAGRAPH = G LEDAD2GEO = P //LEDAD3GEO = D3 LEDAWINDOW = W

CC = g++ CFLAGS=-g -O -Wall -I.. -D_REENTRANT OPTIONS = -lpthread INCL= $(LEDAROOT)/incl

XLIB_PATH = -L/usr/X11R6/lib

XLIB = -lX11

UNIXLIB = \ -L$(LEDAROOT) \ -l$(LEDAWINDOW) \ -l$(LEDAD2GEO) \ -l$(LEDAGRAPH) \ -l$(LEDAMAIN) \ $(XLIB) -lm

TARGET = main OBJECTS = main.o

all: $(TARGET)

.cpp.o : $(CC) $(CFLAGS) $(OPTIONS) -I$(INCL) -c $^ $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) $(OPTIONS) -o $(TARGET) $(OBJECTS) $(XLIB_PATH) $(UNIXLIB)

clean: rm -rf $(OBJECTS) core main

arsenal
() автор топика

А ты пробовал доку на твою LED'у читать?
Что там сказано по поводу дружбы с тредами?
Может быть, она не является thread-safe?

И еще у тебя непонятно получается.
Вот один пост:
> Ошибок нет и окно не создается.
Вот второй:
> изменил код а segmentation fault все равно присутствует.

Как это понимать?
1) Окно не создается, и вообще ничего не происходит.
2) Окно не создается, потому что происходит segfault.
Какой из этих вариантов имеет место?
Если второй, то что значит "ошибок нет"?
Segfault -- норма?

И вообще, что из себя представляет тип window в твоей проге?
Что делается в этой строке:
> int exit_but = W.button("Exit",111);
?
И где у тебя инициализация самой LED'ы?
Это же либа какая-то, да?
Если либа, то в ней должен быть вызов XOpenDisplay.
По идее, он должен быть в какой-нибудь функции типа init_<libname>.
Если такая функция есть, то не забыл ли ты ее вызвать?

ЗЫ: если еще захочешь постить сырцы/Makefile'ы/etc, не забудь выбрать тип "Preformatted text" (над кнопкой "Post/Отправить"), а то читать твои посты трудно. Что у тебя в Makefile написано -- хрен поймешь.

nobody ★★
()

дело стиля и подхода к организации... но я никогда не мешаю гуй и алгоритмы. потоки нужны не для создания окошек. в тртетий раз пощу (это русское слово? ,))www.advancedlinuxprogramming.com - читайте и разбирайтесь

зы
есть сильное подозрение, что проблема все-таки в этой леде...

laban
()
Ответ на: комментарий от laban

спасибочки большое а что касается английского то изучаю по-маленьку очень буду рад любой полезной документации на английском

arsenal
() автор топика

#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);
        }
}
Вообщем скомпилил ЛЕДУ как требовалось теперь f() в main-не корректно обрабатывает события а вот если поместить вызов f() в поток то она как-то странно их обрабатывает а именно срабатывает на 100-ый раз только

arsenal
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.