Форум программистов, компьютерный форум CyberForum.ru

Как создать поток в Linux? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.77
MaD1
Сообщений: n/a
14.03.2011, 20:56     Как создать поток в Linux? #1
Программеры!
Подскажите, пожалуйста, как создавать потоки в Linux.
В Windows есть CreateThread(), а в Linux как? Можно спросить иначе: как, опираясь только на
стандарт С++, создать поток?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
palva
 Аватар для palva
2373 / 1595 / 190
Регистрация: 08.06.2007
Сообщений: 6,364
Записей в блоге: 4
14.03.2011, 21:34     Как создать поток в Linux? #2
В линукс другой механизм. Читайте про функцию fork.
MaD1
Сообщений: n/a
14.03.2011, 21:50     Как создать поток в Linux? #3
почитаю...
(Phantom)
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 86
15.03.2011, 10:16     Как создать поток в Linux? #4
Вообщето fork пораждает процесс с телом как и радительский. Его в дальнешем можно заменить на выполнение другой прогой.

Есть pthread_create которая и создает поток.
MaD1
Сообщений: n/a
15.03.2011, 18:20     Как создать поток в Linux? #5
'fork - порождает дочерний процесс'. Функция fork() возвращает PID процесса,
но что мне делать с этим PID'ом %) ? В CreateThread(), допустим, передается как
параметр имя функции, а fork'ом как?
Но я нашел функцию :

int clone(int (*fn) (void *), void *child_stack, int flags, void *arg)

Первый параметр, как я понял, это имя функции, которая и будет дочерним процессом.
2й - размер стека, я так и не понял что туды писать .
3й - параметры. 4й - это аргумент, который передается в функцию, которую вызывают.
Все ли правильно я понял ? И какой размер стека указывать и вообще на что он
должне указывать?
Ghost
Сообщений: n/a
15.03.2011, 21:42     Как создать поток в Linux? #6
2 MaD1 - пользуйся форком )
По поводу - что делать - вот примерчик:
Код
    log('test 02', 'test2');
    TypeLog();
    exit(0);

//    pipe(wr);
//    pipe(rd);

    if (fork() == 0)
    {
        //  Дитеныш - работаем в дочернем процессе
    }
    else
    {
        //  Родитель
    }
(Phantom)
0 / 0 / 0
Регистрация: 26.05.2009
Сообщений: 86
16.03.2011, 11:45     Как создать поток в Linux? #7
fork() тяжеле в работе. Если много процессов нужно порадить, то лутше всетаки воспользоваться нитями.

И нельзя будет пользоваться общими переменными. Нужно будет смотреть в сторону шаред памяти.

ЗЫ один плюс у fork(), очень много про него сказано и простой в использовании.
MaD1
Сообщений: n/a
16.03.2011, 21:28     Как создать поток в Linux? #8
С форком получается, спасибо. Но не могли бы вы объяснить про pthread_create? man ничего толкового сказать не может
MaD1
Сообщений: n/a
16.03.2011, 21:43     Как создать поток в Linux? #9
fork работает, но но вот эти дела с
if(fork()==0)
...
else
...
мне совсем непонятны...
пытаюсь использовать pthread_create, вот что я пишу:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

void *m(void *l)
{
printf('I'm thread.');
return NULL;
}

int main(int argc, char *argv[])
{
pthread_t p;
pthread_create(&p, NULL, m, NULL);
return 0;
}

и вот что выводится при компиляции:

[mad@xa mad]$ g++ k.cpp
/home/mad/tmp/ccuc69pG.o(.text+0x3c): In function `main':
: undefined reference to `pthread_create'
collect2: ld returned 1 exit status

в чем дело?
Ghost
Сообщений: n/a
17.03.2011, 01:11     Как создать поток в Linux? #10
И я тоже не сразу допер )
Перевожу - if (fork() == 0) - это код, позволяющий отследить - кто родиттель, а кто потомок.
Как? Потомок запускается В ЭТОЙ САМОЙ ТОЧКЕ - в точке fork - т.е. представь себе, что с этого момента у тебя есть 2 процесса, оба исполняются из точки форка, только один родитель, а другой - потомок. Как ты их различишь? Правильно - для родителя возвращается ID потомка, а потомку о себе надо знать одно - он потомок. Вот отсюда и сравнение с 0-лем.
Ghost
Сообщений: n/a
17.03.2011, 01:14     Как создать поток в Linux? #11
1. http://uinc.ru/articles/34/#thread_creat
2. Думаю, не хватает какого-нибудь инклуда, посмотри в статье. Кстати - ты подо что пишешь?
Ghost
Сообщений: n/a
17.03.2011, 15:29     Как создать поток в Linux? #12
Думаю, что эта ссылка (ниже) ответит на все возникшие вопросы. По крайней мере - у меня пока все вопросы сняты
http://www.citforum.ru/operating_systems/linux/calc_in_linux/
MaD1
Сообщений: n/a
17.03.2011, 17:43     Как создать поток в Linux? #13
В смысле подо что пишу? Пишу под linux ... вообще-то прога должна работать и
на BSD. В общем прогу я делаю дома в mandrake а тестирую в FreeBSD,
и еще где шелл найду )) Спасибо за ссылки, ща почитаю. Кстати, если мне нужно 2 процесса
породить, с форком это делается так:

if(fork()==0)
{
//девочка
}else
{
if(fork()==0)
{
//мальчик
}else
{
//мама
}
}

??? и так далее ?
'это код, позволяющий отследить - кто родиттель, а кто потомок' - да я это понял! Я не понял
почему прога дальше не работает, это же просто проверка условия! Проверил - пополз дальше...
не пойму... нутипа:
if(suxx=suxxx)
{
blalblabla
}
....поехали дальше

ЗЫ ты не тот _GHOST- в irc?
MaD1
Сообщений: n/a
17.03.2011, 17:45     Как создать поток в Linux? #14
В смысле подо что пишу? Пишу под linux ... вообще-то прога должна работать и
на BSD. В общем прогу я делаю дома в mandrake а тестирую в FreeBSD,
и еще где шелл найду )) Спасибо за ссылки, ща почитаю. Кстати, если мне нужно 2 процесса
породить, с форком это делается так:

if(fork()==0)
{
//девочка
}else
{
if(fork()==0)
{
//мальчик
}else
{
//мама
}
}

??? и так далее ?
'это код, позволяющий отследить - кто родиттель, а кто потомок' - да я это понял! Я не понял
почему прога дальше не работает, это же просто проверка условия! Проверил - пополз дальше...
не пойму... нутипа:
if(suxx=suxxx)
{
blalblabla
}
....поехали дальше

ЗЫ ты не тот _GHOST- в irc?
MaD1
Сообщений: n/a
17.03.2011, 18:53     Как создать поток в Linux? #15
Спасибо, я все понял все работает !

Вот в чем была проблема:
когда я компилировал с '#include <pthread.h>', при компиляции было это:

k.cpp: In function `int main(int, char**)':
k.cpp:21: error: `pthread_create' undeclared (first use this function)
k.cpp:21: error: (Each undeclared identifier is reported only once for each function it appears in.)

все так и должно быть. Когда я инклудил pthread.h, было это:

/home/mad/tmp/ccQc9s5R.o(.text+0x3c): In function `main':
: undefined reference to `pthread_create'
collect2: ld returned 1 exit status

и только в документе о 'Многопотоковые вычисления в системе Linux' я увидел:
'Данную программу необходимо компилировать с библиотекой pthread (именно в ней находятся все функции для работы с потоками)'

Вот в чем проблема была ! компильнул вот так: 'g++ k.cpp -lpthread' - все пошло как по маслу.
Спасибо блин всем!
nero_wolfe
0 / 0 / 0
Регистрация: 21.05.2010
Сообщений: 109
17.03.2011, 20:03     Как создать поток в Linux? #16
Про программирование в ОС Unix читате тут http://cs.mipt.ru/docs/courses/osstud/os.html.
Ghost
Сообщений: n/a
17.03.2011, 20:57     Как создать поток в Linux? #17
2 nero - спасибо, почитаю )
2 mad - дык в мане все было написано )))
я собирал так: g++ -lc_r -o pt.o pthread.cpp
Ghost
Сообщений: n/a
17.03.2011, 20:59     Как создать поток в Linux? #18
вау! неро - спасибо, то, что искал.
Ghost
Сообщений: n/a
17.03.2011, 21:01     Как создать поток в Linux? #19
1. а что значит - прога дальше не работает?
2. не тот ) я своей аське с ирками не изменяю ))))))))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 21:03     Как создать поток в Linux?
Еще ссылки по теме:

Как создать свой поток и связать его с консолью C++
Создать отдельный управляемый поток для бесконечного процесса C++
Не могу создать файл в поток ofstream C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ghost
Сообщений: n/a
17.03.2011, 21:03     Как создать поток в Linux? #20
3. а кто мешает загнать в цикл форканье? ) и если потомок, то выходить из цикла? ) а то так ты больно тяжелый код наваяешь )
Yandex
Объявления
17.03.2011, 21:03     Как создать поток в Linux?
Ответ Создать тему
Опции темы

Текущее время: 18:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru