LINUX.ORG.RU

posix thread [C]

 


0

0

Программа должна создать поток и поток должен прервать свое выполнение при i=40.

#include <stdio.h> #include <pthread.h> void *t_f() { int i=0; for(i=0;i<=50;i++){ printf("%d\n",i); if(i==40) pthread_exit(0); } }

int main(void){ pthread_t thr; pthread_create(&thr,NULL,&t_f,NULL); }

При компилировании программы: cc -o pthread ./pthread.c компилятор ругается: /tmp/ccasa4cU.o(.text+0x7a): In function `main': : undefined reference to `pthread_create' collect2: ld returned 1 exit status В чем причина не знаю, только начал разбираться с потоками, help!

anonymous


почитайте пожалуйста книжку о многопоточном программировании в среде POSIX, а? очень поможет и продвинет. "Threads Primer - A Guide to Multithreaded Programming" например.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Boost

> Вот так вот надо компилировать:
> gcc main.c -lpthread

.. ну и еще пачка ошибок, без которых это работать не будет.
все будем разжевывать в очередной раз?
нет уж, пусть лучше книгу почитает.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

gcc pthread_e.c -o a.exc -lrt

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void *Thread(void *string)
{
while (1)
printf("%s\n", (char *)string);
pthread_exit(NULL);
}

int main()
{
char *e_str = "Hello!";
char *f_str = "Bonjour !";

pthread_t e_th;
pthread_t f_th;

int rc;

rc = pthread_create(&e_th, NULL, Thread, (void *)e_str);
if (rc)
exit(-1);
rc = pthread_create(&f_th, NULL, Thread, (void *)f_str);
if (rc)
exit(-1);
sleep(5);

exit(0);
}

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

> s/pthread_exit(NULL);/return NULL;/

это кстати все равно и завершать поток можно и по выходу из тела и по явному pthread_exit(). оба подхода эквивалентны.

http://www.opengroup.org/onlinepubs/009695399/functions/pthread_exit.html

--- cut ---
RATIONALE

The normal mechanism by which a thread terminates is to return from the routine that was specified in the pthread_create() call that started it. The pthread_exit() function provides the capability for a thread to terminate without requiring a return from the start routine of that thread, thereby providing a function analogous to exit().

Regardless of the method of thread termination, any cancellation cleanup handlers that have been pushed and not yet popped are executed, and the destructors for any existing thread-specific data are executed. This volume of IEEE Std 1003.1-2001 requires that cancellation cleanup handlers be popped and called in order. After all cancellation cleanup handlers have been executed, thread-specific data destructors are called, in an unspecified order, for each item of thread-specific data that exists in the thread. This ordering is necessary because cancellation cleanup handlers may rely on thread-specific data.
--- cut ---

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

return и pthread_exit в данном случае, разумеется, делают одно и то же, но зачем использовать более сложную конструкцию вместо более простой?

execve
()

pthread_create(&thr, NULL, function, NULL); ... pthread_kill(thr,SIG*); printf("end\n"); какой сигнал надо послать процессу thr, что бы он завершил свою работу, а программа , продолжила работу, выполнив printf("end\n"); ?

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

Не рекомендую использовать pthread_cancel
Вернее использовать-то можно, но есть проблемы с реализацией
thread cancellation в Linux (точнее в NPTL), да и не только в нем.

Для замены можно использовать условные переменные:
phtread_cond_wait(3)
pthread_cond_signal(3)

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

а с _cond вариаблами есть проблема на glibc до 2.3.2 (с бинарной совместимостью) :]. А какие проблемы? (где выражаются)

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

Набери в Google:
pthread_cancel phread_join NPTL problem

Фишка в том, что если поток в это время отрабатывает
функции pthread_*, то все проходит отлично, а вот
если попадаем на accept() или select(), то на
join-е можно получить Segmentation fault.


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

все, разобрался, использовать структуру

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

No such article No such article. news.gmane.org/find-root.php?message_id - 1k - Сохранено в кэше - Похожие страницы

Маловато. Правда я еще немного порылся и нифига не нашел на эту тему. А вообще нехер кэнсэлить такой поток :].

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