Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/48: Рейтинг темы: голосов - 48, средняя оценка - 4.75
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
1

Потоки в linux

10.12.2011, 00:44. Показов 9291. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Нужно сделать задание по потокам, посему нужна информация по них. В задании нужно создавать потоки, реализовать обмен данными между потоками, синхронизировать потоки + синхронизировать потоки методом блокирования (не знаю как это).
Следовательно нужна информацию по всему этому, подойдёт хорошая ссылка (я под linux до этого ничего не писал, было бы неплохо найти ресурс с коммандами линукс, такой себе msdn но для линукса ) на информацию по потокам или хотябы перечислите функции, которые понадобятся для всего этого чтобы было легче в гугле искать информацию по них, ну или может у кого пример завалялся на работу нескольких потоков в linux, он тоже в принципе лишним не будет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2011, 00:44
Ответы с готовыми решениями:

Потоки в Linux
Доброго времени суток! Мучаюсь с потоками для Linux, что-то перемудрила и теперь вылезает ошибка...

Потоки Posix. C Linux
Пишу программу. При компиляции ошибок нет. Когда пытаюсь выполнить выдает ошибку : "Ошибка...

Потоки в Linux.
Здравствуйте. У меня есть задание - реализовать свою собственную библиотеку для работы с потоками...

Потоки в Linux
Написать программу где один поток считывает целые числа, другой возводит в квадрат. #include...

18
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
10.12.2011, 01:06 2
https://computing.llnl.gov/tutorials/pthreads/
1
Заблокирован
10.12.2011, 12:38 3
http://www.amazon.com/Programm... 0201633922
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.12.2011, 16:09  [ТС] 4
Так, а как мне создать отдельный поток ? Ну чтобы моя функция main создавала поток который что-то там поделает, а когда завершиться то тогда мой main продолжил работу. Выгуглить данные по созданию потока в линукс на си у меня что-то не получилось, приведите элементарный пример пожалуйста.

Добавлено через 59 секунд
В задании указано что я должен создавать поток без передачи ему параметров и без его атрибутной записи, ну что такое первое мне понятно, а вот что такое второе?

Добавлено через 4 минуты
Также мне нужно синхронизировать потоки с помощью pthread_join(), это как и это зачем (чего там синхронизировать когда первый поток просто ждёт завершения второго ?).

Добавлено через 5 минут
Выгуглил создание с помощью fork(), но не думаю что это то что мне нужно.

Добавлено через 19 минут
Нашёл код с непонятным примером, но он у меня не компилируется.
C
1
2
3
4
5
6
7
8
9
#include <pthread.h>
int main()
{
 pthread_attr_t tattr;
 pthread_t tid;
 extern void* start_routline(void *arg);
 void *arg;
 int ret;
 ret= pthread_create(&tid, NULL, start_routline,arg);
Всё это не компилируется и пишет undefined reference to pthread_create
ld returned exit status.
Это при том что если пытаться передать в pthread_create мало аргументов то оно ругатеся что их мало значит оно всё же знает что такое pthread_create, так почему же если оно знает сколько ей надо параметров оно потом падает на мороз и выдаёт когда аргументов достаточно что не знает что это такое теперь? Вот странный этот линуксовский компилятор.
Функцию start_routline перед main я определил конечно.

Добавлено через 10 минут
Блин, в этот раз набрал пример с википедии http://ru.wikipedia.org/wiki/POSIX_Threads и всё равно получил ошибку undefined reference to pthread_create, что-то тут не так.
Что нужно подключить чтобы эта pthread_create вызывалась нормально?
У меня подключены
C
1
2
3
4
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
0
Заблокирован
10.12.2011, 16:43 5
gcc ... -lpthread ...
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.12.2011, 16:47  [ТС] 6
LosAngeles, ну почти вовремя, тоже выгуглил буквально минуту назад
0
Заблокирован
10.12.2011, 16:59 7
для этого гугл не нужен, всё что нужнo для понимания ошибки у тебя уже есть:

[root@alexPC include]# grep pthread_create < pthread.h
extern int pthread_create (pthread_t *__restrict __newthread,
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
10.12.2011, 20:53  [ТС] 8
Вопрос на засыпку: почему pid у двух созданных мною тредов одинаковый и должно ли так быть?
C
1
2
3
4
5
6
7
8
    pthread_t thread1;
    pthread_t thread2;
 
    pthread_create(&thread1,NULL,thread_func1,NULL);
    pthread_join(thread1,NULL);
    pthread_create(&thread2,NULL,thread_func2,NULL);
    pthread_join(thread2,NULL);
}
У обоих pid получается 5095 (ну или если что-то изменить в программе, например добавить переменную то какой-то другой но всё равно одинаковый) .

Добавлено через 12 минут
Хотя, если быть точным, то в лабе проситься вывести tid созданных процессов, а не pid, может это не опечатка и есть ещё какой-то tid всё же?

Добавлено через 2 часа 38 минут
Также вот у меня есть задание где один поток считывает данные в массив и передаёт их другому файлу, а для синхронизации этого нужно использовать условную переменную. Так вот о условной переменной я почитал http://linux.vt.tpu.ru/threads/index.html, но мне нужен небольшой пример, ато я не очень понимаю как это всё реализовать.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
10.12.2011, 21:03 9
Gepar, gettid будет скорее всего возвращать одинаковые значения, изза того, что в pthreads если не путаю потокие липовые
в качестве идентификации потоков можно использовать pthread_self
0
1563 / 1041 / 94
Регистрация: 17.04.2009
Сообщений: 2,995
10.12.2011, 23:08 10
На сколько помню. POSIX хочет, чтобы pid у всех потоков процесса был один и тот же. Поэтому потоки объединяются в группу и pid это идентификатор группы. tid это не опечатка, а идентификатор потока внутри группы. man getpid, gettid.
2
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.12.2011, 14:42  [ТС] 11
Ну с pid то ладно, это не столь важно. Другое дело с синхронизацией потоков через переменную (я пока не понял как это вообще применить когда у меня один поток читает данные в массив и передаёт их второму потоку, зачем тут вообще переменная состояния, помоему тут достаточно только семафора) и с тем как передать элементы массива другому потоку чтобы тот их печатал?
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
11.12.2011, 15:02 12
Цитата Сообщение от Gepar Посмотреть сообщение
как передать элементы массива другому потоку чтобы тот их печатал?
через общую память очевидно
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
11.12.2011, 17:06  [ТС] 13
Цитата Сообщение от alex_x_x Посмотреть сообщение
через общую память очевидно
Ну я в итоге сделал в main массив и передал его адрес в параметрах создания потока и первому и второму потокам (первый пишет в массив данные, второй их печатает), этого от меня хотели? Но я не могу это назвать передачей данных другому потоку, фактически первая фукнция тупо пишет данные в массив, ей пофиг будет ли что передаваться второму потоку в main или не будет, она только пишет, передаёт данные то уже main в итоге. Ну да пусть пока так, скажут переделать - переделаю.
Остался последний пункт первой лабораторной: написать программный код что реализует блокирование типа "читатели-писатели". Это что, это где, это как?
Здесь https://computing.llnl.gov/tutorials/pthreads/ об этом не написано, хотя это наиболее полезная ссылка была, по ней в итоге и разобрался со всем, хотя и на английском, но в итоге гораздо понятнее чем то что написано на русском на других ресурсах.
1
204 / 205 / 16
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
11.12.2011, 17:39 14
Остался последний пункт первой лабораторной: написать программный код что реализует блокирование типа "читатели-писатели".
делается мьютексами
http://www.yolinux.com/TUTORIA... RONIZATION
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.12.2011, 02:24  [ТС] 15
villu, вроде и с этим разобрался. Остался только вопрос:
после того как я создал
C
1
pthread_rwlock_t RWLock;
и инициализировал
C
1
pthread_rwlock_init(&RWLock,NULL);
мне память как-то надо освобождать?
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.12.2011, 04:23 16
pthread_rwlock_destroy() ?
1
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
12.12.2011, 13:43  [ТС] 17
niXman, Вы спрашиваете или утверждаете? Хотя судя по гуглу утверждаете, превозмогу лень, запущу виртуалку и добавлю эту строчку в код и буду сдавать лабу тогда. Хотя у меня ещё одна по линуксу осталась: передача сообщений между потоками через каналы, на днях тоже ею займусь, но наверное нужно будет создать отдельную тему если возникнут вопросы.
0
Эксперт С++
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
12.12.2011, 15:45 18
Цитата Сообщение от Gepar Посмотреть сообщение
Вы спрашиваете или утверждаете?
намекаю
0
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
14.12.2011, 12:55 19
Цитата Сообщение от Gepar Посмотреть сообщение
превозмогу лень, запущу виртуалку
Вообще есть pthread для mingw

Добавлено через 18 минут
Цитата Сообщение от Gepar Посмотреть сообщение
Ну я в итоге сделал в main массив и передал его адрес в параметрах создания потока и первому и второму потокам (первый пишет в массив данные, второй их печатает), этого от меня хотели? Но я не могу это назвать передачей данных другому потоку, фактически первая фукнция тупо пишет данные в массив, ей пофиг будет ли что передаваться второму потоку в main или не будет, она только пишет, передаёт данные то уже main в итоге.

Я пришёл к такому варианту:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <stdio.h>
#include <string.h>
#include <pthread.h>
 
pthread_mutex_t shared_array_mutex = PTHREAD_MUTEX_INITIALIZER;
char shared_array[ 256 ] = {0};
char shared_array_changed = 0; // флаг говорит о том, что даные обновлены
 
void * filler_thread( void * v )
{
    static const char messages[][16] = { "Hello, world!", "Message 2", "Message 3" };
 
    int local_change_counter;
   
    for( local_change_counter = 0;
         local_change_counter < 3;
         local_change_counter++ )
    {
        usleep( 1000000 ); // пущай повисит маленько
 
        // ждём пока поток вывода не пометит данные как устаревшие
        for(;;)
        {
           pthread_mutex_lock( &shared_array_mutex );
      
           if( shared_array_changed == 0 )
              break;
      
           pthread_mutex_unlock( &shared_array_mutex );
        }
      
        strcpy( shared_array, messages[ local_change_counter ] );
        shared_array_changed = 1;
        pthread_mutex_unlock( &shared_array_mutex );      
    }
    
    pthread_exit( 0 );
}
 
void * printer_thread( void * v )
{
   int local_change_counter;
   
   for( local_change_counter = 0;
        local_change_counter < 3;
        local_change_counter++ )
   {
   
      // ждём пока поток заполненя не пометит данные как обновлённые
      for(;;)
      {
         pthread_mutex_lock( &shared_array_mutex );
      
         if( shared_array_changed == 1 )
            break;
      
         pthread_mutex_unlock( &shared_array_mutex );
      }
      
      puts( shared_array );
      shared_array_changed = 0;
      pthread_mutex_unlock( &shared_array_mutex );
   }
   
   pthread_exit( 0 );
}
 
int main( void )
{
   pthread_t th_filler, th_printer;
   
   pthread_create( &th_printer, 0, printer_thread, 0 );
   pthread_create( &th_filler, 0, filler_thread, 0 );
   
   pthread_join( th_printer, 0 );
   pthread_join( th_filler, 0 );   
   
   printf( "done.\n" );
 
   return 0;
}
Хотя могу быть не прав.
0
14.12.2011, 12:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2011, 12:55
Помогаю со студенческими работами здесь

Потоки Posix. C++ Linux
Начал изучать потоки posix. Нашел книгу в которой рассказано и показано как создавать потоки,...

Не завершаются потоки в Linux
Дело вот в чем. Надо, значит, мне производить разбор пакетов, которые получаю по сети (TCP)....

Потоки из Linux под Windows
Здравствуйте форумчане. У меня такая проблема, я очень плохо шарю в потоках и не получается...

Что такое потоки ввода, потоки вывода?
Здарова всем! Не так давно уже прогаю на С++ и все НИКАК не могу понять, что такое потоки ввода,...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru