Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: программа вылетает при запуске треда
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Linux
andybeg
перестали запускаться треды в тестовой программе
Цитата
#include <pthread.h>
pthread_t master_thread;
void* fmaster(void)
{
printf("thread\n");
}
int main()
{
int s;
printf("thread\n");
s = pthread_create(&master_thread, 0,fmaster,0);
if (s != 0)
printf("errcode %d",s);
while(1)
{
printf("main thread\n");
}
return 0;
}

прграмма комилируется и вылетает не печатая printf("errcode %d",s);
понимаю что где то в ядре надо это настроить, но make menuconfig ничего похожего не выдаёт, раньше потоки работали, но корявые ручки что то не там поправили sad.gif
andybeg
посмотрел настройки make -C uClibc menuconfig
напротив POSIX Threading Support звёздочка стоит... теперь совсем ничего не понятно sad.gif
makefile вроди бы вполне стандартный
EXEC = uart
OBJS = uart.o
CFLAGS += -D__USE_BSD

all: $(EXEC)

$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS) -lpthread

romfs:
$(ROMFSINST) /bin/$(EXEC)

clean:
rm -f $(EXEC) *.gdb *.elf *.o
andybeg
прошёлся по функции pthread_create, выяснилось что она вылетает на
Цитата
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void * (*start_routine)(void *), void *arg)
{
pthread_descr self = thread_self();
struct pthread_request request;

if (__pthread_manager_request < 0) {
if (__pthread_initialize_manager() < 0) return EAGAIN;
}

request.req_thread = self;
request.req_kind = REQ_CREATE;
request.req_args.create.attr = attr;
request.req_args.create.fn = start_routine;
request.req_args.create.arg = arg;
sigprocmask(SIG_SETMASK, (const sigset_t *) NULL,
&request.req_args.create.mask);
PDEBUG("write REQ_CREATE to manager thread\n");
TEMP_FAILURE_RETRY(__libc_write(__pthread_manager_request,
(char *) &request, sizeof(request)));
PDEBUG("before suspend(self)\n");
suspend(self);<<<<<<<<<<<<<<<<<<<вылетает тут
PDEBUG("after suspend(self)\n");
if (THREAD_GETMEM(self, p_retcode) == 0)
*thread = (pthread_t) THREAD_GETMEM(self, p_retval);
printf("exit\n");
return THREAD_GETMEM(self, p_retcode);
}

Цитата
static inline void suspend(pthread_descr self)
{
/* See pthread.c */
#ifdef __NR_rt_sigaction
__pthread_wait_for_restart_signal(self);
#else
__pthread_suspend(self);
#endif
}
andybeg
худо, бедно победил проблему, не понял в чём она заключалась, но так как раньше у меня эти треды работали, а между тем как они работали и перестали работать была перестановка бубунты и вероятно сменой тулчейна, на что в итоге и стал грешить, поэтому откатившись на нулёвый сырец uClinux и на самый первый безглючный тулчейн получил работающие треды ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.