У меня есть матрица M[nxn]
и вы должны вычислить сумму элементов в точке [n, n] с учетом следующих критериев:
- произвольно выберите строку или столбец;
-sum это элементы в последнем элементе этой строки или столбца и установить остальные элементы в 0;
Теперь проблема в том, что я должен блокировать каждую строку или столбец, с которыми я работаю, потому что мне нужно сделать эту сумму, используя несколько процессов. Как я могу это решить?
Я знаю, что я должен использовать fcntl()
и некоторые другие вещи, которые принадлежат ему, но меня интересует метод его решения.
(Спасибо, что посоветуете!)Как суммировать матричные элементы с помощью блокировки файлов (unix - C/C++)
ответ
Вам фактически не нужно блокировать матрицу (если только она не находится в файле). Если он в файле, я бы просто загрузил матрицу в память сначала, а затем вам не нужен замок. Посмотрите на это следующим образом:
Если у вас есть матрица nxm, попросите родительский процесс переделать m дочерних процессов и дождитесь, пока дочерние процессы будут обработаны.
В каждом дочернем процессе каждый из них принимает каждый из m строк.
Пусть каждый дочерний процесс складывает каждую строку и устанавливает значения в 0 и помещает сумму в последний столбец.
Завершить каждый дочерний процесс.
Когда все сделано, попросите свой родительский процесс подвести n-я строка столбца.
Поскольку все дочерние процессы будут действовать на свой собственный набор данных, им не нужно будет блокировать какую-либо часть матрицы, так как мы не будем получать доступ к той же области памяти.
Спасибо за ваш ответ. Фактически, это можно сделать так, но моя задача - случайным образом выбрать строку/столбец и сумму таким образом, и мне нужно заблокировать эту строку/столбец, чтобы избежать дублирования. – Adorjan
int ret = fcntl (fd, F_SETLKW, &lock); заблокирует этот файловый дескриптор для записи. Затем вы можете записать его в файл, продолжая читать его с другими потоками. – Magn3s1um