Нити и мьютексы; запирающая часть массива - PullRequest
1 голос
/ 16 февраля 2011

Я пытаюсь распараллелить операцию, используя pthreads. Процесс выглядит примерно так:

double* doSomething( .... )  {   
 double* foo;   
 foo = new double[220];  

 for(i = 0; i<20; i++)  
 {  
  //do something with the elements in foo located between 10*i and 10*(i+2)  
 }  

 return foo; 
}

Все, что происходит внутри цикла for, может быть выполнено в любом порядке, поэтому я хочу организовать это с помощью потоков.

Например, я мог бы использовать несколько потоков, чтобы каждый поток проходил через части цикла for, но работал с разными частями массива. Чтобы избежать проблем при работе с перекрывающимися частями, мне нужно заблокировать часть памяти.

Как создать мьютекс (или что-то еще), который блокирует только часть массива?

Ответы [ 3 ]

1 голос
/ 07 апреля 2011

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

Создайте глобальную переменную:

int _iNextSection;  

Всякий раз, когда поток готов к работераздел, поток получает следующий доступный раздел следующим образом:

iMySection = __sync_fetch_and_add(&_iNextSection, 1);

__ sync_fetch_and_add () возвращает текущее значение _iNextSection и затем увеличивает _iNextSection.__sync_fetch_and_add () является атомарным, что означает, что __sync_fetch_and_add () гарантированно завершится до того, как другой поток сможет это сделать.Без блокировки, без блокировки, просто, быстро.

1 голос
/ 16 февраля 2011

Если вы используете последнюю версию gcc, вы можете попробовать параллельные версии стандартных алгоритмов. См. параллельный режим libstdc ++ .

0 голосов
/ 16 февраля 2011

Если цикл выглядит точно так, как вы написали, я бы использовал массив из 21 мьютекса и блокировал в каждом потоке i-й (i + 1) -й мьютекс в начале цикла.

Так что-то вроде:

...
for (i = 0; i < 20; i++) {
 mutex[i].lock();
 mutex[i+1].lock();
 ...
 mutex[i+1].unlock();
 mutex[i].unlock();
}

Логика заключается в том, что только два выполнения соседних циклов могут получить доступ к одним и тем же данным (если ограничения [i * 10, (i + 2) * 10)), поэтому вам нужно беспокоиться только о них.

...