- Linux обмен данными между потоками
- Linux pipes tips & tricks
- Pipe — что это?
- Логика
- Простой дебаг
- Исходный код, уровень 1, shell
- Исходный код, уровень 2, ядро
- Tips & trics
- Перенаправление ввода/вывода в Linux
- Введение
- Требования
- Потоки
- Стандартный ввод
- Пример
- Стандартный вывод
- Пример
- Стандартная ошибка
- Пример
- Перенаправление потока
- Пример
- Каналы
- Пример
- Пример
- Фильтры
- Пример
- Пример
- Заключение
Linux обмен данными между потоками
позднее он в цикле инициализируется объектом (тоже в main)
>> arg = new DATA;
но удаляется объект почемуто из функций потоков
>> delete a; // удаляем свои данные
причем удаление происходит После разблокирования мутекса!
Так делать очень опасно!
можете легко прибить чужой объект или вычитать чужие данные (чтение тоже выполняется вне лока мутекса почемуто)
Безопасные варианты:
1) создать массив указателей
DATA *arg[SIZE_I][SIZE_J]
и отдавать каждому потоку указатель на индивидуальный кусок памяти.
2)выполнять все операции с общей памятью только при заблокированном мутексе (тоесть в потоках чтение, модификация и освобождение общей памяти должно быть внутри общего pthread_mutex_lock(&lock)).
3) удалять объекты только в том потоке который их создал.
Код статьи в качестве примера использовать не рекомендуется ибо в нем автор наступил на те грабли от которых по идее должен уберечь читателей.
3, Romzzzec ( ? ), 12:48, 14/09/2010 [ответить] | + / – |
>>pthread_create(&thr[i+z], NULL, input_thr, (void *)arg); как я понял должны создаваться потоки для ввода каждого элемента матрицы, но >>//Ожидаем завершения всех потоков при Источник Linux pipes tips & tricksPipe — что это?Pipe (конвеер) – это однонаправленный канал межпроцессного взаимодействия. Термин был придуман Дугласом Макилроем для командной оболочки Unix и назван по аналогии с трубопроводом. Конвейеры чаще всего используются в shell-скриптах для связи нескольких команд путем перенаправления вывода одной команды (stdout) на вход (stdin) последующей, используя символ конвеера ‘|’: grep выполняет регистронезависимый поиск строки “error” в файле log, но результат поиска не выводится на экран, а перенаправляется на вход (stdin) команды wc, которая в свою очередь выполняет подсчет количества строк. ЛогикаКонвеер обеспечивает асинхронное выполнение команд с использованием буферизации ввода/вывода. Таким образом все команды в конвейере работают параллельно, каждая в своем процессе. Размер буфера начиная с ядра версии 2.6.11 составляет 65536 байт (64Кб) и равен странице памяти в более старых ядрах. При попытке чтения из пустого буфера процесс чтения блокируется до появления данных. Аналогично при попытке записи в заполненный буфер процесс записи будет заблокирован до освобождения необходимого места. Простой дебагИсходный код, уровень 1, shellТ. к. лучшая документация — исходный код, обратимся к нему. Bash использует Yacc для парсинга входных команд и возвращает ‘command_connect()’, когда встречает символ ‘|’. PIPE_IN и PIPE_OUT — файловые дескрипторы, содержащие информацию о входном и выходном потоках. Они могут принимать значение NO_PIPE, которое означает, что I/O является stdin/stdout. Исходный код, уровень 2, ядроОбратимся к коду ядра и посмотрим на имплементацию функции pipe(). В статье рассматривается ядро версии 3.10.10 stable. Максимальный размер блока данных, который будет записан в конвейер, равен одной странице памяти (4Кб) для архитектуры arm: Tips & tricsВ примерах ниже будем выполнять ls на существующую директорию Documents и два несуществующих файла: ./non-existent_file и. /other_non-existent_file. Перенаправление и stdout, и stderr в pipeили же можно использовать комбинацию символов ‘|&’ (о ней можно узнать как из документации к оболочке (man bash), так и из исходников выше, где мы разбирали Yacc парсер bash): Перенаправление _только_ stderr в pipeShoot yourself in the foot Получение корректного кода завершения конвейраПо умолчанию, код завершения конвейера — код завершения последней команды в конвеере. Например, возьмем исходную команду, которая завершается с ненулевым кодом: Обычно же нам нужно знать, если в процессе выполнения конвейера произошла ошибка. Для этого следует выставить опцию pipefail, которая указывает оболочке, что код завершения конвейера будет совпадать с первым ненулевым кодом завершения одной из команд конвейера или же нулю в случае, если все команды завершились корректно: Источник Перенаправление ввода/вывода в LinuxВведениеСтандартные потоки ввода и вывода в Linux являются одним из наиболее распространенных средств для обмена информацией процессов, а перенаправление >, >> и | является одной из самых популярных конструкций командного интерпретатора. В данной статье мы ознакомимся с возможностями перенаправления потоков ввода/вывода, используемых при работе файлами и командами. Требования
ПотокиСтандартный ввод при работе пользователя в терминале передается через клавиатуру. Стандартный вывод и стандартная ошибка отображаются на дисплее терминала пользователя в виде текста. Ввод и вывод распределяется между тремя стандартными потоками:
Потоки также пронумерованы: Из стандартного ввода команда может только считывать данные, а два других потока могут использоваться только для записи. Данные выводятся на экран и считываются с клавиатуры, так как стандартные потоки по умолчанию ассоциированы с терминалом пользователя. Потоки можно подключать к чему угодно: к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением:
Стандартный вводСтандартный входной поток обычно переносит данные от пользователя к программе. Программы, которые предполагают стандартный ввод, обычно получают входные данные от устройства типа клавиатура. Стандартный ввод прекращается по достижении EOF (конец файла), который указывает на то, что данных для чтения больше нет. EOF вводится нажатием сочетания клавиш Ctrl+D. Рассмотрим работу со стандартным выводом на примере команды cat (от CONCATENATE, в переводе «связать» или «объединить что-то»). Cat обычно используется для объединения содержимого двух файлов. Cat отправляет полученные входные данные на дисплей терминала в качестве стандартного вывода и останавливается после того как получает EOF. ПримерВ открывшейся строке введите, например, 1 и нажмите клавишу Enter. На дисплей выводится 1. Введите a и нажмите клавишу Enter. На дисплей выводится a. Дисплей терминала выглядит следующим образом: Для завершения ввода данных следует нажать сочетание клавиш Ctrl + D. Стандартный выводСтандартный вывод записывает данные, сгенерированные программой. Когда стандартный выходной поток не перенаправляется в какой-либо файл, он выводит текст на дисплей терминала. При использовании без каких-либо дополнительных опций, команда echo выводит на экран любой аргумент, который передается ему в командной строке: Аргументом является то, что получено программой, в результате на дисплей терминала будет выведено: При выполнении echo без каких-либо аргументов, возвращается пустая строка. ПримерКоманда объединяет три файла: file1, file2 и file3 в один файл bigfile: Команда cat по очереди выводит содержимое файлов, перечисленных в качестве параметров на стандартный поток вывода. Стандартный поток вывода перенаправлен в файл bigfile. Стандартная ошибкаСтандартная ошибка записывает ошибки, возникающие в ходе исполнения программы. Как и в случае стандартного вывода, по умолчанию этот поток выводится на терминал дисплея. ПримерРассмотрим пример стандартной ошибки с помощью команды ls, которая выводит список содержимого каталогов. При запуске без аргументов ls выводит содержимое в пределах текущего каталога. Введем команду ls с каталогом % в качестве аргумента: В результате должно выводиться содержимое соответствующей папки. Но так как каталога % не существует, на дисплей терминала будет выведен следующий текст стандартной ошибки: Перенаправление потокаLinux включает в себя команды перенаправления для каждого потока. Команды со знаками > или — стандартный вывод, Команды со знаками >> или > — стандартный вывод, ПримерВ приведенном примере команда cat используется для записи в файл file1, который создается в результате цикла: Для завершения цикла нажмите сочетание клавиш Ctrl + D. Если файла file1 не существует, то в текущем каталоге создается новый файл с таким именем. Для просмотра содержимого файла file1 введите команду: В результате на дисплей терминала должно быть выведено следующее: Для перезаписи содержимого файла введите следующее: Для завершения цикла нажмите сочетание клавиш Ctrl + D. В результате на дисплей терминала должно быть выведено следующее: Предыдущего текста в текущем файле больше не существует, так как содержимое файла было переписано командой >. Для добавления нового текста к уже существующему в файле с помощью двойных скобок >> выполните команду: Для завершения цикла нажмите сочетание клавиш Ctrl + D. Откройте file1 снова и в результате на дисплее монитора должно быть отражено следующее: КаналыКаналы используются для перенаправления потока из одной программы в другую. Стандартный вывод данных после выполнения одной команды перенаправляется в другую через канал. Данные первой программы, которые получает вторая программа, не будут отображаться. На дисплей терминала будут выведены только отфильтрованные данные, возвращаемые второй командой. ПримерВ результате каждый файл текущего каталога будет размещен на новой строке: Перенаправлять данные с помощью каналов можно как из одной команды в другую, так и из одного файла к другому, а перенаправление с помощью > и >> возможно только для перенаправления данных в файлах. ПримерДля сохранения имен файлов, содержащих строку «LOG», используется следующая команда: Вывод команды dir отсылается в команду-фильтр find. Имена файлов, содержащие строку «LOG», хранятся в файле loglist в виде списка (например, Config.log, Logdat.svd и Mylog.bat). При использовании нескольких фильтров в одной команде рекомендуется разделять их с помощью знака канала |. ФильтрыФильтры представляют собой стандартные команды Linux, которые могут быть использованы без каналов:
Как правило, все нижеприведенные команды работают как фильтры, если у них нет аргументов (опции могут быть):
Если в качестве аргумента передается файл, команда-фильтр считывает данные из этого файла, а не со стандартного потока ввода (есть исключения, например, команда tr, обрабатывающая данные, поступающие исключительно через стандартный поток ввода). ПримерКоманда tee, как правило, используется для просмотра выводимого содержимого при одновременном сохранении его в файл. ПримерДопускается перенаправление нескольких потоков в один файл: В результате сообщение о неверной опции «z» в команде ls будет записано в файл t2, поскольку stderr перенаправлен в файл. Для просмотра содержимого файла file3 введите команду cat: В результате на дисплее терминала отобразиться следующее: ЗаключениеМы рассмотрели возможности работы с перенаправлениями потоков >, >> и |, использование которых позволяет лучше работать с bash-скриптами. Источник |