2013-06-14 3 views
0

У меня есть матрица M[nxn] и вы должны вычислить сумму элементов в точке [n, n] с учетом следующих критериев:
- произвольно выберите строку или столбец;
-sum это элементы в последнем элементе этой строки или столбца и установить остальные элементы в 0;

Теперь проблема в том, что я должен блокировать каждую строку или столбец, с которыми я работаю, потому что мне нужно сделать эту сумму, используя несколько процессов. Как я могу это решить?
Я знаю, что я должен использовать fcntl() и некоторые другие вещи, которые принадлежат ему, но меня интересует метод его решения.
(Спасибо, что посоветуете!)Как суммировать матричные элементы с помощью блокировки файлов (unix - C/C++)

ответ

0

Вам фактически не нужно блокировать матрицу (если только она не находится в файле). Если он в файле, я бы просто загрузил матрицу в память сначала, а затем вам не нужен замок. Посмотрите на это следующим образом:

Если у вас есть матрица nxm, попросите родительский процесс переделать m дочерних процессов и дождитесь, пока дочерние процессы будут обработаны.

В каждом дочернем процессе каждый из них принимает каждый из m строк.

Пусть каждый дочерний процесс складывает каждую строку и устанавливает значения в 0 и помещает сумму в последний столбец.

Завершить каждый дочерний процесс.

Когда все сделано, попросите свой родительский процесс подвести n-я строка столбца.

Поскольку все дочерние процессы будут действовать на свой собственный набор данных, им не нужно будет блокировать какую-либо часть матрицы, так как мы не будем получать доступ к той же области памяти.

+0

Спасибо за ваш ответ. Фактически, это можно сделать так, но моя задача - случайным образом выбрать строку/столбец и сумму таким образом, и мне нужно заблокировать эту строку/столбец, чтобы избежать дублирования. – Adorjan

+0

int ret = fcntl (fd, F_SETLKW, &lock); заблокирует этот файловый дескриптор для записи. Затем вы можете записать его в файл, продолжая читать его с другими потоками. – Magn3s1um