Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрый вопрос (на многопоточные и высоконагруже... нные приложения) 
:(
    Опции темы
boostcoder
Дата 6.6.2011, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(afiskon @  6.6.2011,  20:41 Найти цитируемый пост)
Называлось типа RWLock.

угу.

Цитата(afiskon @  6.6.2011,  20:41 Найти цитируемый пост)
Интересно, а как оно реализуется?

исходники boost всегда открыты! smile 
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(afiskon @  6.6.2011,  20:41 Найти цитируемый пост)
Компилятор имеел полное право реализовать операцию чтения, как какой-нибудь push, _x_ / pop eax - вот и нет никакой атомарности. 

В общем-то примерно так он и поступит, с чего ему генерировать потокобезопасный код?
В большинстве случаев на современных x86 процессорах - да, операции с int могут быть атомарными, но это только по той причине, что x86 гарантирует атомарные чтение и запись (это две разные операции, не путать с операцией чтение, изменение, запись - RMW) для aligned переменных, это гарантирует, что переменная не может попасть в две разные кэш-линии, но это для x86, для любого процессора теоретически такой гарантии нет, к тому же Вы должны удостовериться, что переменная верно размещена.

Цитата(afiskon @  6.6.2011,  20:41 Найти цитируемый пост)
Только вы уверены, что это поможет на двухъядерном процессоре?

Естественно, они для того и созданы.

Добавлено через 1 минуту и 16 секунд
Цитата(afiskon @  6.6.2011,  20:45 Найти цитируемый пост)
Где про это почитать?

наверное это прозвучит нескромно, но вот тут немного написано.
PM   Вверх
boostcoder
Дата 6.6.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  6.6.2011,  20:47 Найти цитируемый пост)
операции с int могут быть атомарными

именно "могут". ибо компилятору в голову что-то взбредет, и он сгенерит такой код, который будет читать/писать его как два short`а, или даже четыре char`а. а он это может.
опытным путем, я однажды доказал, что на х86 архитектуре, только операции с однобайтовыми переменными всегда атомарны. к сожалению, результаты "доказательства" привести не могу.
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(afiskon @  6.6.2011,  20:41 Найти цитируемый пост)
Называлось типа RWLock. Интересно, а как оно реализуется? 

Если интересуют подобные вопросы, очень советую прочитать книгу The Art of Multiprocessor Programming. Алгоритм довольно простой.

Цитата(boostcoder @  6.6.2011,  20:52 Найти цитируемый пост)
именно "могут". ибо компилятору в голову что-то взбредет, и он сгенерит такой код, который будет читать/писать его как два short`а, или даже четыре char`а. а он это может.
опытным путем, я однажды доказал, что на х86 архитектуре, только операции с однобайтовыми переменными всегда атомарны. к сожалению, результаты "доказательства" привести не могу. 

А что тут доказывать? если переменная попадет в две разные кэш-линии - хрен операции с ней будут атомарными. Если числовое значение адреса переменной делиться на ее размер - тогда операции с переменными вплоть до 8 байтов будут атомарными (это я про современные процессоры).

Это сообщение отредактировал(а) azesmcar - 6.6.2011, 20:54
PM   Вверх
boostcoder
Дата 6.6.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(azesmcar @  6.6.2011,  20:52 Найти цитируемый пост)
А что тут доказывать?

ну... мне в тот момент требовалось в этом удостоверится воочию.
PM WWW   Вверх
azesmcar
Дата 6.6.2011, 21:07 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Вот простейший алгоритм RWLock-а, если кому интересно. Пример написан на Java, но идея должна быть понятна.

Код

public class SimpleReadWriteLock implements ReadWriteLock {
    int readers;
    boolean writer;
    Lock lock;
    Condition condition;
    Lock readLock, writeLock;

    public SimpleReadWriteLock() {
        writer = false;
        readers = 0;
        lock = new ReentrantLock();
        readLock = new ReadLock();
        writeLock = new WriteLock();
        condition = lock.newCondition();
    }
    public Lock readLock() {
        return readLock;
    }
    public Lock writeLock() {
        return writeLock;
    }
}

class ReadLock implements Lock {
    public void lock() {
        lock.lock();
        try {
            while (writer) {
                condition.await();
            }
            readers++;
        } finally {
            lock.unlock();
        }
    }
    public void unlock() {
        lock.lock();
        try {
            readers--;
            if (readers == 0)
                condition.signalAll();
        } finally {
            lock.unlock();
        }
    }
}

class WriteLock implements Lock {
    public void lock() {
        lock.lock();
        try {
            while (readers > 0) {
                condition.await();
            }
            writer = true;
        } finally {
            lock.unlock();
        }
    }
    public void unlock() {
        writer = false;
        condition.signalAll();
    }
}


Это сообщение отредактировал(а) azesmcar - 6.6.2011, 21:08
PM   Вверх
azesmcar
Дата 6.6.2011, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Совсем забыл, вот же RWLock на C++ smile 
А вот его Lock-Free аналог.

Добавлено через 2 минуты и 11 секунд
Кстати, вот еще на тему о RWLock-е.
http://www.1024cores.net/home/lock-free-al...-writer-problem
здесь проводиться тест на масштабируемость с использованием pthread_rwlock_t.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.