Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
MaD1
#1

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

14.03.2011, 20:56. Просмотров 3028. Ответов 19
Метки нет (Все метки)

Программеры!
Подскажите, пожалуйста, как создавать потоки в Linux.
В Windows есть CreateThread(), а в Linux как? Можно спросить иначе: как, опираясь только на
стандарт С++, создать поток?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2011, 20:56
Ответы с готовыми решениями:

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный...

Как создать свой поток и связать его с консолью
Собственно возник такой вопрос: читаю Саттера пробую создать свой класс...

Как создать виртуальный поток и переопределить оператор <<?
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный. ...

Не получается создать поток
Здравствуйте. Есть код, создающий поток: #include &quot;stdafx.h&quot; #include...

НЕ могу создать поток
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;thread&gt;...

19
palva
3099 / 2232 / 449
Регистрация: 08.06.2007
Сообщений: 8,131
Записей в блоге: 4
14.03.2011, 21:34 #2
В линукс другой механизм. Читайте про функцию fork.
0
MaD1
14.03.2011, 21:50 #3
почитаю...
(Phantom)
0 / 0 / 1
Регистрация: 26.05.2009
Сообщений: 86
15.03.2011, 10:16 #4
Вообщето fork пораждает процесс с телом как и радительский. Его в дальнешем можно заменить на выполнение другой прогой.

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

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

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

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

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

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

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

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

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

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

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

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

ЗЫ ты не тот _GHOST- в irc?
MaD1
17.03.2011, 18:53 #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 / 1
Регистрация: 21.05.2010
Сообщений: 109
17.03.2011, 20:03 #16
Про программирование в ОС Unix читате тут http://cs.mipt.ru/docs/courses/osstud/os.html.
0
Ghost
17.03.2011, 20:57 #17
2 nero - спасибо, почитаю )
2 mad - дык в мане все было написано )))
я собирал так: g++ -lc_r -o pt.o pthread.cpp
Ghost
17.03.2011, 20:59 #18
вау! неро - спасибо, то, что искал.
Ghost
17.03.2011, 21:01 #19
1. а что значит - прога дальше не работает?
2. не тот ) я своей аське с ирками не изменяю ))))))))
Ghost
17.03.2011, 21:03 #20
3. а кто мешает загнать в цикл форканье? ) и если потомок, то выходить из цикла? ) а то так ты больно тяжелый код наваяешь )
17.03.2011, 21:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2011, 21:03

Создать фаловый поток
#include &lt;stdio.h&gt; #define n 24 void main() { int i,j=0,p,a; for...

Создать свой поток данных
Не могу понять, возможно ли как то создать свой поток данных? Знаю есть...

Можно ли в DLL создать поток?
Мне необходимо создать DLL, в котором был бы отдельный поток Windows. Однако,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru