|
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 14
|
||||||
Передача трёхмерного массива в pthread_create16.05.2017, 18:47. Показов 3631. Ответов 17
Метки нет (Все метки)
Решить задачу с помощью нескольких потоков. Каждый поток должен вывести свой
идентификатор и отработать заданное время. Массивы заполняются с помощью функции random(). Имеется 10 массивов данных (размера >100). Требуется посчитать количество четных и нечётных элементов в каждой строке массива. Каждая строчка в отдельном потоке.
0
|
||||||
| 16.05.2017, 18:47 | |
|
Ответы с готовыми решениями:
17
Передача нескольких параметров в pthread_create (передача структуры)
|
|
Почетный модератор
11555 / 4350 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
|
|||||||
| 21.05.2017, 21:22 | |||||||
Кстати, при создании потока вы всегда перетираете один и тот же дескриптор, т.к. в вызове pthread_create() указываете pt без индекса.
0
|
|||||||
|
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 14
|
|
| 22.05.2017, 20:11 [ТС] | |
|
Humanoid, проблему с указателями в потоковой функции я уже решила, но всё равно спасибо) А при указании pt с индексом выводит варнинг "passing argument 1 of 'pthread_create' makes pointer from integer without a cast".
0
|
|
|
Почетный модератор
11555 / 4350 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
|
||||||
| 22.05.2017, 23:15 | ||||||
0
|
||||||
|
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 14
|
|
| 23.05.2017, 20:44 [ТС] | |
|
Humanoid, не сочти за наглость, но можешь ещё хотя бы на мысль натолкнуть, от чего может быть здесь ошибка сегментирования)
0
|
|
|
Почетный модератор
11555 / 4350 / 452
Регистрация: 12.06.2008
Сообщений: 12,454
|
|
| 24.05.2017, 20:57 | |
|
Так вы же при создании передаёте потоку указатель на arr[i]... т.е. в поток уже передаётся двумерный массив. Но в самом потоке вы работаете с ним как с трёхмерным.
1
|
|
|
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 14
|
|
| 07.06.2017, 18:37 [ТС] | |
|
Humanoid, спасибо большое, очень помогли
0
|
|
|
1 / 1 / 0
Регистрация: 25.02.2021
Сообщений: 5
|
|
| 25.02.2021, 19:40 | |
|
Здравствуйте. Вы бы не могли пожалуйста написать как вы решили проблему с ошибкой сегментации?
0
|
|
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
|
| 26.02.2021, 18:10 | |
|
Боюсь девушка решает уже совсем другие задачи и она вам уже не ответит
![]() Ошибка сегментации возникает, если разименовать пустой или не проинициализированный указатель. Возможно произошло обращение за пределы массива. Понять что случилось можно с помощью отладчика gdb. Если интересно как это сделать, скажите. Что касается данной конкретной реализации, то она плохая. Во-первых в коде полно неименованных констант. Во-вторых, очень сомнительно использование pthread_join после создания потока. Это все-равно что запускать код последовательно
1
|
|
|
1 / 1 / 0
Регистрация: 25.02.2021
Сообщений: 5
|
|
| 26.02.2021, 20:55 | |
|
Огромное спасибо за ответ. Я совсем нуб в си. У меня похожее задание по контрольной и я искал рабочий пример применения библиотеки pthread для обработки трехмерного массива, чтобы попытаться выполнить свою задачу по примеру. Поэтому я был бы крайне признателен просто за рабочий код, который выполняет данную задачу, чтобы на его примере я смог разобраться со своей задачей. Если вам не сложно внести необходимые корректировки в представленный в теме код, чтобы снять ошибку сегментирования и заставить его работать, то это было бы для меня очень полезно, так как я сам не обладаю для этого достаточными знаниями.
0
|
|
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
|||||||||||
| 26.02.2021, 22:48 | |||||||||||
|
Я тут набросал небольшой пример, дальше попробуй сам.
1
|
|||||||||||
|
1 / 1 / 0
Регистрация: 25.02.2021
Сообщений: 5
|
||||||
| 27.02.2021, 02:45 | ||||||
|
Огромное спасибо. Очень красиво написан код. Просто приятно даже посмотреть как составлен. Буду разбираться теперь в нём.
Добавлено через 1 час 14 минут Ваш код работает идеально со статическим массивом. Но у меня, насколько я понимаю, возникла та же проблема, что и у изначального автора топика. Я пытаюсь передать в поточную функцию динамический трехмерный массив и получаю ошибку сегментирования. Вы бы не могли пожалуйста показать как нужно работать с динамическими трехмерными массивами в потоковой функции? И хотел бы ещё добавить, что ваш пример со статическим массивом это лучшее, что я видел по теме многопоточности в си и он способен заменить начинающим с десяток лекций. Я создаю массив таким образом.
0
|
||||||
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
||||||
| 27.02.2021, 10:13 | ||||||
|
Ну что ж, давай еще немного поиграемся. Прежде чем начнем работать с памятью, давай подумаем, а как она устроена.
- Память это пространство, у которого есть начальный адрес, размерность одной ячейки и длина. - Память можно выделить статически. Она будет выделяться при загрузке программы и если там будут не нулевые значения, она будет автоматически проинициализированна и будет занимать место в исполнимом файле - Память может быть выделена динамически, во время исполнения программы. Тогда по окончании работы, такую память нужно возвращать Теперь нюансы. Несмотря на то, что я сказал, что Память характеризуется 'размерностью одной ячейки' - это понятие условно. Размерность это подсказка компилятору, как он должен работать с памятью, как он должен применять свою компиляторскую математику. Ничто нам не мешает в процессе исполнения, изменять эту условность и подходить к памяти с другой линейкой. Есть специальный универсальный тип, который называется void. Он говорит компилятору: - "Смотри на это как на нечто, что ты не понимаешь, но не задавай вопросов". Его мы можем использовать, чтобы передавать любой тип в функцию, а затем мы будем его приводить к нужному. Компилятор даже не пикнет (это не относится к C++, там несколько другие правила) Как мы можем выделять Память для нашего трехмерного массива. 1) Выделить один большой блок, затем сказать компилятору, как его интерпретировать (типа приложить трафарет с рисунком нашего массива). 2) Выделить массив указателей на int*, для каждого указателя выделить свой блок (то как ты попытался сделать) Думаю понятно, что эффективнее выделить один блок? Теперь программа, я внес изменения
1
|
||||||
|
1 / 1 / 0
Регистрация: 25.02.2021
Сообщений: 5
|
|
| 27.02.2021, 12:46 | |
|
Огромное спасибо! Вам нужно преподавать в университете, если вы уже это не делаете. Очень доступно и главное понятно написано. Повторюсь, что это лучшее по теме, что я где-либо видел.
1
|
|
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
||||||
| 27.02.2021, 16:40 | ||||||
|
И все же, ответ будет не полным, если мы не рассмотрим работу с указателем типа (int ***aaa). Особенность этого подхода в способе выделения памяти, а так же в ее освобождении
1
|
||||||
|
1 / 1 / 0
Регистрация: 25.02.2021
Сообщений: 5
|
|
| 27.02.2021, 17:48 | |
|
fish9370, ваш код и комментарии объяснили мне огромное количество белых пятен. Это действительно лучше десятка двухчасовых лекций. Спасибо.
0
|
|
|
13 / 13 / 0
Регистрация: 21.10.2011
Сообщений: 58
|
||||||
| 27.02.2021, 18:59 | ||||||
|
Ну и конечно, хорошо бы сделать такой массив, в котором каждая строчка была бы случайной длины
Вот например с такими характеристиками
1
|
||||||
|
366 / 222 / 53
Регистрация: 18.10.2017
Сообщений: 2,358
|
|
| 27.02.2021, 20:13 | |
|
Если есть какие-то трудности с трёхмерным массивом, то просто делайте его одномерным
и сами обеспечивайте правильное вычисления индекса. Он же физически именно одномерный. Я иногда так делал. Это нетрудно, ведь количество элементов по каждому измерению известно, простая формула пересчитает три индекса в один.
1
|
|
| 27.02.2021, 20:13 | |
|
Помогаю со студенческими работами здесь
18
Передача функции-члена класса в pthread_create Выделить память для трехмерного массива и изменить индексы начального элемента массива Заполнение трехмерного массива Сортировка трехмерного массива Сортировка трехмерного массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма).
На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
|
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes.
А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения
развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
|
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ *
Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам
Кирхгофа, решает её и находит:
токи, напряжения и их 1 и 2 производные при t = 0;. . .
|
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым.
Но восстановить их можно так.
Для этого понадобится консольная утилита. . .
|
|
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
|
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|