Multithreading+pipes05.12.2015, 14:45. Показов 1135. Ответов 10
Метки нет (Все метки)
Помогите с кодом, пожалуста.
В упражнении два трэда ( write и read ) должны обменяться сообщением через pipes. Read-тред выдает ошибку Bad file descriptor. Не могу понять почему. Вот код и компиляция с выводом:
0
|
|||||||||||
| 05.12.2015, 14:45 | |
|
Ответы с готовыми решениями:
10
Linux pipes(каналы) Тестирование multithreading/multiprocessing программы Multithreading |
|
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
|
|
| 07.12.2015, 14:09 | |
|
Вынесите создание пайпа из функции write. Скорее всего "читатель" запускается быстрее и естественно читает невалидный дескриптор пайпы. То, что вы видите, что "Writer started" напечаталось быстрее, ничего не значит!!!
1
|
|
|
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
|
|
| 07.12.2015, 14:34 | |
|
Под что аллокацию?? под буфер?? Зависит от размера. Пока (1024 байт) вы помещаетесь в стек.
Если этого достаточно для упражнения, то можно и не использовать malloc
1
|
|
|
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
|
|
| 10.12.2015, 02:13 | |
|
Я не догоняю может ночью, но в чем смысл делать close.
Вот man fdopen the fdopen function assotiates a stream with the existing file descriptor. и т.д. fdopen не создает новый дескриптор, а использует уже имеющийся. А Вы ему сразу в начале потока close делаете. Понятное дело, программа в растерянности.
1
|
|
| 10.12.2015, 08:11 [ТС] | |
|
bsa916115, это не обычная программа, которая выполняется последовательно действие за действием. Это мультитрединг, в котором в идеале все треды выполняются процессором одновременно. Но так как до идеала далеко, то каждый тред может прервать любой другой в любой точке. Поэтому надо закрывать поток, в случае если управление перехватил другой тред.
Могу выложить готовый код, вы можете его запустить на линуксе и увидите, что его выполнение раз от раза другое.
0
|
|
|
51 / 24 / 12
Регистрация: 10.10.2015
Сообщений: 107
|
|
| 10.12.2015, 08:32 | |
|
У Вас pipe - глобальная переменная, которой могут играть все потоки. Если один поток делает close(id), то другой поток уже никак не напишет туда.
Добавлено через 16 минут Извините, меня прервали. Многопоточность - такая вещь, где надо быть очень осторожным. Если у Вас в данном случае используется fdopen, то он использует глобальный дескриптор. Он в потоке закрывается. Все потоки вроде как делят глобальные переменные. Если в одном потоке дескриптор закрылся, то в другом потоке в него записать нельзя. Вот так как-то.
2
|
|
|
1265 / 979 / 384
Регистрация: 02.09.2012
Сообщений: 3,026
|
|
| 11.12.2015, 15:02 | |
|
все верно bsa916115 говорит.
эти close используются в классических примерах про pipe, но между ПРОЦЕССАМИ != ПОТОКИ, когда это после fork действительно оправдано. я не проверял ваш код, но тоже согласен, что надо убрать лишние close
1
|
|
| 12.12.2015, 16:23 [ТС] | |
|
Сейчас проверил. Без этих "лишних" close() выполнение зависает. А с ними работает отлично.
Добавлено через 7 минут А, прошу прощения. Я этот код переделал и он действительно отлично работает без лишних close()...
0
|
|
| 12.12.2015, 16:23 | |
|
Помогаю со студенческими работами здесь
11
boost и Multithreading Multithreading: ExecutorService Multithreading (монитор) ! Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|