предложение atomic memcpy


При тестировании программы на масштабируемость я столкнулся с ситуацией, когда мне нужно сделать мою операцию memcpy как атомарную. Мне нужно скопировать 64 байта данных из одного места в другое.
Я нашел одно решение, которое использует вращение по переменной:

struct record{
    volatile int startFlag;
    char data[64];
    volatile int doneFlag;
};

и псевдокод следует

struct record *node;
if ( node->startFlag ==0 ) {  // testing the flag 
    if( CompareAndSwap(node->startFlag , 0 ,1 ) ) {  // all thread tries to set, only one will get success and perform memcpy operation 
        memcpy(destination,source,NoOfBytes);
        node->doneFlag = 1; // spinning variable for other thread, those failed in CompAndSwap 
    }
    else {
         while ( node->doneFlag==0 ) { // other thread spinning 
          ; // spin around and/or use back-off policy  
         }
   }}

Может ли это работать как атомарная memcpy? Хотя, если поток, выполняющий memcpy, будет вытеснен (до или после memcpy, но до установки doneFlag), тогда другие будут продолжать вращаться. Или что можно сделать, чтобы сделать это атомарным.
Ситуация похожа на то, что другой поток должен ждать, пока данные не будут скопированы, поскольку они должны сравнивать вставленные данные со своими собственными данными.
Я использую подход test-and-test-and-set в случае startFlag, чтобы сократить некоторые дорогостоящие атомные операции. Спин-блокировки также масштабируемы, но я измерил, что атомарные вызовы дают лучшую производительность, чем спин-блокировки, более того, я ищу проблемы, которые могут возникнуть в этом фрагменте. И поскольку я использую свой собственный диспетчер памяти, выделение памяти и бесплатные вызовы обходятся мне дорого, поэтому использование другого буфера и копирование в него содержимого, установка указателя (поскольку размер указателя находится в атомарной операции) обходится дорого, поскольку требуют много вызовов mem-alloc и mem-free.

EDIT Я не использую мьютексы, потому что они не кажутся масштабируемыми , более того, это всего лишь часть программы, что очень важно секция не такая уж маленькая (я понимаю, что для большей критической секции сложно использовать атомарные операции).

6
задан peeyush 18 July 2011 в 08:07
поделиться