Реализация потоковых массивов - PullRequest
4 голосов
/ 26 сентября 2011

Я хочу реализовать похожую на массив структуру данных, позволяющую нескольким потокам одновременно изменять / вставлять элементы. Как я могу получить это в отношении производительности? Я реализовал класс-оболочку вокруг std :: vector и использовал критические секции для синхронизации потоков. Пожалуйста, посмотрите на мой код ниже. Каждый раз, когда поток хочет работать с внутренними данными, он может ждать других потоков. Следовательно, я думаю, что его производительность НЕ хороша. :( Есть идея?

class parallelArray{
private:
    std::vector<int> data;
    zLock dataLock; // my predefined class for synchronizing
public:
    void insert(int val){
         dataLock.lock();
         data.push_back(val);
         dataLock.unlock();
    }

    void modify(unsigned int index, int newVal){
         dataLock.lock();
         data[index]=newVal; // assuming that the index is valid
         dataLock.unlock();
    }
};

Ответы [ 2 ]

1 голос
/ 26 сентября 2011

Посмотрите на shared_mutex в библиотеке Boost.Это позволяет вам иметь несколько читателей, но только один писатель

http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.shared_mutex

0 голосов
/ 26 сентября 2011

Лучший способ - использовать быструю блокировку чтения-записи .Вы выполняете общую блокировку для доступа только для чтения и эксклюзивную блокировку для доступа для записи - таким образом, доступ только для чтения выполняется одновременно.

В пользовательском режиме Win32 API имеется Slim Reader / Writer (SRW)Блокировки доступны в Vista и более поздних версиях.

До Vista вам нужно самостоятельно реализовать функцию блокировки чтения-записи, что является довольно простой задачей.Вы можете сделать это с одним критическим разделом, одним событием и одним значением enum / int.Хотя для хорошей реализации потребовалось бы больше усилий - я бы использовал вручную связанный список локальных (выделенных в стеке) структур для реализации справедливой очереди ожидания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...